Ancients Wargame — Core Rulebook v3. The canonical, version-controlled rules (served in-game at
/rulebook.html). Edit this file to change the rules; where the code and the rulebook differ, the rulebook wins.
ANCIENTS WARGAME
Core Rulebook — v3.17
A Cohesion-First Tabletop Wargame of Ancient Battle
Playtest edition — all design decisions to date, consolidated
Compiled 3 June 2026 (v3) · last revised 1 August 2026 (v3.17). Version history in §14.
Designer's Note
This edition consolidates every settled mechanic into one playable whole. The design is now considered ready to test rather than to debate: from here, questions are answered with figures on a table, not in the abstract.
The system models ancient battle as a contest of cohesion — armies are defeated when their formations lose order, not when casualties are tallied. Four axes drive every combat, each mapping to a different real-world thing:
Who you are (training) → quality dice (Elite / Regular / Levy).
What you are (mass, equipment) → a weight result-shift.
Where you are (position) → flat modifiers: overlap, flank, rear, high ground.
Exceptions → a short list of special rules: shock, evade, steady spears.
“Battles are decided by overlap and pressure. Cohesion creates advantage; fragmentation invites collapse.”
Contents
1. Design Philosophy
Cohesion-first warfare. Defeat comes from disorder and loss of formation, not body count.
Pressure breaks armies. A unit tires from being hit, flanked, or turned — not from simple movement or attacks. (Difficult or greedy movement is the one exception; see Section 5.)
Geometry over bookkeeping. Advantage comes from physical position — overlaps, flanks, rears, high ground.
A minimal core plus a few special rules. The four axes apply to everyone; exceptions are short, single-sentence keywords.
Collapse is earned and visible. When a formation breaks, you see it fragment and stream away.
2. Components & Scale
Base. The standard miniature mounting (e.g. four figures on a stand). The Base is the unit at which combat is resolved. All Bases share the same frontage, but each carries a depth — measured in Bases: a depth-D Base is D Bases stacked in one hex (a compact deep formation). Depth buys staying power (a deep Base absorbs more before breaking and counts as more when it does, §6, §12.1), a scoped combat bonus (§9.7), and prices manoeuvre (§5.5). A lone Base is depth 1.
Block. A contiguous group of Bases of the same troop type, touching flank to flank — a single rank (depth lives on each Base, not in ranks behind). The Block is the manoeuvre unit and the level at which cohesion is tracked. Blocks exist mechanically only to generate overlaps; fragmentation removes them.
Base-width (BW). The unit of measurement for the whole game — one Base frontage. Measuring in BW keeps the game independent of figure scale and ties distance to the same frontage the overlap rules use.
Default distances (tunable in playtest): foot move 2 BW; light foot and skirmishers 3 BW; cavalry 4 BW. Missile range is per weapon (§10): javelin 2 BW, bow 4 BW, sling 5 BW (a generic missile is 3 BW) — every range is ≥ 2 so a shooter always out-ranges melee.
Spatial substrate. These rules are geometry-agnostic, but the digital playtest and reference substrate is a hex grid with edge-facing (v3.17): each Base occupies one hex (one BW) and faces an edge, which gives it a true forward — it can march straight ahead — and a mirror-symmetric split of its six faces into one front · two oblique-front · two flank · one rear, with distance measured in hexes. The frontal arc (front + both obliques) is the penalty-free zone; the flanks and the single rear face are where position tells. The spatial model is specified separately (edge-facing replaced the earlier vertex-facing, which replaced a square grid); nothing in these rules assumes a particular grid.
3. Units: Quality, Weight & Type
Every Block has a quality class, a weight rating, a troop type, and possibly one or more special rules.
3.1 Quality (training) — dice
Quality is expressed entirely as dice: Elite rolls two and keeps the best, Regular rolls one, Levy rolls two and keeps the worst. There is no quality modifier table. This same keep-best/keep-worst rule serves both the movement test and combat — only the type of die differs by context.
| Quality | Dice kept |
|---|---|
| Elite | best of two |
| Regular | one |
| Levy | worst of two |
Which die
Movement test: always d6. The Fatigue scale (1–6, break above 6) is coupled to the move test, so movement needs the full d6 range or high-Fatigue units would freeze solid.
Combat: the averaging die — faces 2, 3, 3, 4, 4, 5 — is the standard (mandated for competition). Same mean as a d6 (3.5, so it pairs with the d6 move test with no offset) but about a third the variance and a maximum swing of ±3. It compresses the luck in a positionally-neutral fight while leaving an earned positional swing (shock, flank, weight) fully decisive. A plain d6 is an optional high-swing 'open/friendly' mode.
Because keep-best/keep-worst feeds on the dice's tails and the averaging die has thin tails, quality reads as reliability rather than raw power: an Elite lands 4–5 most of the time and rarely whiffs, a Levy rarely spikes, a Regular is the most variable. (The retired alternatives — a d4 tier, a no-dice mode, and a flat quality table — are not used.)
3.2 Weight (mass & equipment) — a relative ladder
Weight is a number from 1 (lightest) to 5 (heaviest), assigned per era on the army list. It is relative: a hoplite is a 3 whether it faces lighter Persians or the heavier phalanx, and context decides whether that is an advantage. Weight drives the combat result-shift (Section 9.4) and the terrain cost (Section 8). Because the combat shift is capped at 2, the 1–5 ladder is effectively only 0/+1/+2 in melee (Cataphract-5 vs Skirmisher-1 is the same +2 as Hoplite-3 vs Skirmisher-1); the full range only bites in the terrain formula.
3.3 Troop Types
Default weight ratings, articulation (reform class, §6.2), and special rules (tunable per army list):
| Type | Weight | Articulation | Special rules |
|---|---|---|---|
| Heavy Infantry | 4 | Drilled | Steady spears (if spear-armed) |
| Medium Infantry | 3 | Trained | — |
| Light Infantry | 2 | Trained | — |
| Skirmishers | 1 | Trained | Evade |
| Warband | 3 | Inarticulate | Shock (it is simply shock infantry) |
| Pike | 4 | Massed | Steady spears; deep melee support (§9.7) |
| Cavalry (shock horse) | 4 | Trained | Shock |
| Cataphract / Knight | 5 | Trained | Shock |
| Light Cavalry | 2 | Trained | Light-horse (no shock; optional pursuit) |
| Chariot | 4 | Trained | Shock |
Articulation sets how a type re-cuts its formation (reform, §6.2): drilled at half cost and easier tests, trained at full cost, massed at double cost and harder tests, inarticulate not at all. Quality then sets whether the re-cut comes off (the execution test).
General rules, army-specific abilities. The rules above are the general system;
individual armies customise their troops through the abilities on the army list —
bow / sling / javelin / missile (§10), shock / evade / steadySpears /
lightHorse (§11), and massedVolley (§9.7/§10). The same "Medium Infantry" can be a
melee-shy Persian sparabara archer block (bow, massedVolley) in one list and a
close-order spear line in another — the type sets the defaults, the army list tunes the
unit. See docs/design/army-lists.md.
4. Sequence of Play
Players alternate whole-army turns (IGOUGO), each running in four phases — but the phases are not all one-sided:
Move — the active player only moves Blocks (movement test, difficult-move and terrain costs, chaining; charges move into contact).
Shoot — both sides' missile troops fire.
Combat — every melee on the table is resolved; the active player chooses the order.
Recovery — the active player's uncommitted Bases recover Fatigue (Section 6.1).
Phase symmetry. Both players act in the Shoot and Combat phases; only the active player moves and recovers. So a locked melee or a shooting exchange is fought on each player's turn — static fights grind at double rate per round. Ordering matters in Combat: a push-back in one fight can strip an overlap before the next resolves, so the active player sequences combats to engineer cascades — a deliberate initiative advantage.
5. Movement
The movement test. Every voluntary move requires a movement test: roll your quality dice and equal or beat the Block's average Fatigue (Section 6), or the move does not happen. The first move each turn is free of Fatigue cost — it is not penalised — but it is still tested, so a fatigued Block can fail to move even on its first attempt.
5.1 Difficult moves
A difficult move — changing formation, interpenetrating friends, or crossing difficult terrain — costs Fatigue, applied after the move. Simple advances on open ground are free. Re-facing the body in place (the ±60° pivot of the hex substrate) is free by default; its Fatigue cost is a tuning knob, in case free pivoting makes formations too protean.
Forward and sidestep (v3.17). With edge facing a Block may step straight ahead through its front face, or slide one hex through either oblique-front face without turning — dressing the line, sidestepping to cover a gap. It may not step backward or through a flank; giving ground is a combat result (§9.6), not a move.
5.2 Extra moves (chaining)
First move: take the movement test; no Fatigue cost.
Each additional move: pay 1 Fatigue before moving, then take the movement test against the now-raised Fatigue.
On success the move executes. A failed test ends the Block's movement for the turn; on a failed extra move the Fatigue paid is still lost.
Chain as far as you dare. Forced marches and impetuous charges are possible, but each extra move raises Fatigue and the next test's difficulty, pushing toward break. Greed is self-punishing — no cap is needed.
5.3 Charges & shock
A charge is a move ending in contact. A Shock unit (Section 11) generates shock only when it makes contact on a chained second move, the first having been a full move — so shock is an extra move, paid for and tested like any other, and a charge can fail to connect.
5.4 The two movement costs are independent
Tempo cost: 1 Fatigue, before the move, gating whether the move happens.
Terrain cost: variable, after the move (Section 8).
They do not interact except that both drain Fatigue — so rushing through bad ground is prohibitive (a rushed second move into heavy woods can cost +3 in a single tile).
5.5 Wheeling a line
A normal move keeps a formation's footprint; the in-place pivot only re-faces it (flipping a line to a column). To swing a block to a new facing while it keeps its shape, wheel it — an atomic 60° turn about a chosen flank unit.
Cost is the far corner, plus depth's drag. A Block is a single rank, so wheeling it about a flank pivot swings the far end through frontage − 1 base-widths. Depth is no longer Bases on the table, but a deep body is still ponderous, so a deep Block adds a manoeuvre penalty — depthWheelPenalty × (depth − 1) base-widths, a config knob — on top. The wheel consumes ceil((frontage − 1 + that penalty) ÷ move allowance) moves, resolved as a chained move (first free and tested, each further move +1 Fatigue and its own test). A failed required test aborts the wheel — it does not happen — but the Fatigue paid is still lost.
Large formations effectively cannot wheel — by design. Beyond the smallest units this runs to several chained moves: slow, expensive, and likely to fail or break. That rigidity is deliberate and historical (a great phalanx could not turn quickly), and is the counterweight to the big-block advantages elsewhere (mass = resilience, width = overlaps). Reorient a large block instead by the free in-place pivot, or by splitting it into sub-blocks (§6.2), moving each independently, and re-merging if you wish. Every wheeled Base's destination must be clear, so a single enemy stand on a needed hex blocks the full-60° wheel — an accepted blocking play for now.
Close order cannot wheel (v3.14, §6.3). A Block in close order (locked shields) cannot wheel at all — the receive posture trades away the turn. Loosen to fighting order first (a Move-phase action that ends the move, §6.3), then wheel.
5.6 Column march (follow-the-leader)
A column moves by following its lead unit. The leader makes a normal move; every other unit then advances along the leader's exact path, each taking the position and facing the unit ahead of it had — the file slides forward like a snake, bending through any turn the leader made. A column covers a full move's distance and can turn corners at no frontage penalty (unlike a wheel), but it presents a one-unit front and is horribly exposed in contact. Travel in column; fight in line.
Following resolves the left/right question. A follower never independently picks its own step — it walks the leader's recorded track, so it always goes where the unit ahead went. The choice of forward-or-slide (and any pivot) belongs to the lead unit alone.
Bends persist. A column that snaked around a corner stays bent; straightening it back into a dressed line is a separate reshape (a difficult move), so a hard march can leave you needing to re-form before fighting.
6. Fatigue & Cohesion
Fatigue is tracked per hex, and depth is measured in Bases (§2): a depth-D Base is D Bases stacked in one hex. Each hex's Fatigue is the total over its D ranks — a fresh depth-D hex holds D (each rank at 1). A Block's true size is Σ depth (its Bases counted with their depth), and its cohesion is the plain average per Base — total Fatigue ÷ Σ depth — which the Block breaks past when it exceeds 6 (Section 12). Equivalently, a Block absorbs 6 × Σ depth total Fatigue before it goes: the depth-3 + depth-2 + depth-1 block is 6 Bases, absorbs 36, and its loss counts as 6 Bases (§12.1).
A hex's Fatigue rises from what happens to it. A combat loss is one Base's worth of disorder felt at the front rank, so it adds +1 to the hex total per point — which, spread over D ranks, raises the hex's per-Base Fatigue by only 1/D. That is why deep endures: a lone depth-6 hex soaks six times the combat a single Base does before its average passes 6. Movement, by contrast, tires the whole formation — every rank marches — so a move that costs 1 adds +depth to the hex total (its per-Base Fatigue rises by the full 1).
Depth = width, at a narrower front. A wide Block of single Bases and a narrow deep Block of the same Σ depth are identically durable — same Bases, same 6·Σdepth capacity. Depth simply trades frontage for a compact footprint: the phalanx concentrates its staying power at one point (fewer Bases exposed to lapping) instead of spreading it wide (more frontage, more overlaps). Keeping a Block together is what makes it durable; fragmenting or thinning it is genuinely costly.
Break threshold. A Block breaks when its average Base Fatigue — total Fatigue ÷ Σ depth — exceeds 6. Re-check it immediately after combat and after any split or merge.
The state table reads a Base's per-rank Fatigue (its hex total ÷ its depth — the tiredness of a single rank):
| Fatigue (per Base) | State | Meaning |
|---|---|---|
| 1–2 | Fresh | Fully ordered |
| 3–4 | Pressed | Disordered but functional |
| 5–6 | Shaken | On the brink |
| over 6 | Broken | Formation lost; the Block breaks and routs (on the Σ-depth-weighted average) |
6.1 Recovery
Recovery runs at the end of the active player's turn, per Base.
Recovery. An uncommitted Base recovers one Base's worth of Fatigue if, that turn, it did not act: its Block did not move or attempt to move, and the Base itself was not in combat, did not fire (§10), and (by the competition default) was not shot at. Because a combat loss went into a deep Base diluted (1/depth per point, §6), recovery comes out the same way — a depth-D Base's per-Base Fatigue drops by 1/D per turn, so a deep formation has inertia both ways. A failed move attempt counts as acting and denies recovery to the whole Block; Fatigue never drops below 1. (Recovery symmetry is flagged for playtest review — see decisions-log.)
No smoothing pass. Earlier versions ran a second pass each turn that shuffled Fatigue between a Block's Bases to de-spike the most-worn one. Depth-as-a-Base-count already gives a deep formation its staying power — a combat loss dilutes across its depth (§6) — so the reservoir is inherent, not reconstructed by a per-turn shuffle. The smoothing pass is retired.
6.2 Splitting & merging
In the Move phase a player may freely split a Block into smaller legal Blocks, or merge adjacent legal Blocks (same type, contiguous, same orientation, unengaged for a merge). Splitting is free — coming apart into legal sub-Blocks in good order costs nothing. Only merging costs Fatigue, paid at the seam: each Base that ends up on the join — adjacent to a Base of a formerly-separate Block — takes +1 Fatigue, once, however many such neighbours it has.
Splitting from an engaged Block (v3.13). A Block in contact may still split, provided the peeled Bases are not themselves in a direct melee — a 1-to-1 front-edge engagement (§9.1). Bases that are merely overlapping (lapping an enemy but not the paired combatant), adjacent on a flank, or free at the rear can peel off while the Bases actually fighting stay put. So a partly-engaged line can detach its uncommitted wing or overlaps to send them elsewhere; only the men in the melee itself are locked. (Merging still requires both Blocks unengaged.)
The cost is on re-forming order, not on breaking it. Pulling a formation apart is entropy — free. Putting order back together under a general's hand is the effortful act, so that is where the tax sits (and the enemy shoving you apart is charged separately, §9.6). This is the asymmetry that makes giving ground and reorganising cheap while a solid, re-formed line is dear.
Flat per Base, and it still adds up. The merge cost is per Base on the join — there is no whole-Block penalty, and a Base pays the same +1 whether it borders one across-seam neighbour or several. But it mounts across a wide join: assembling a broad Block from single stands pays a seam-Base at every junction, so its interior is born tired. You cannot cheaply conjure a phalanx from scattered bases.
Merging pools Fatigue. The merged Block's Bases keep their own Fatigue and its average is recomputed over all of them — no 'take the higher value'.
This is how you reorient a large formation. Rather than wheel a big Block (near-infeasible, §5.5), split it into sub-Blocks (free), move each freely, and re-merge if you wish — paying only the merge seam. This single tool replaces any bespoke wheel-the-whole-block or form-line maneuver.
Reform — trading frontage for depth (widen & deepen). Because depth is a Base stat (§6), not ranks on the table, split and merge only change frontage; depth is managed by reforming. In the Move phase a Block not in contact redistributes its Bases between frontage and depth, conserving manpower — frontage × depth is preserved, the same men in a new formation. This is the only way to change a unit's depth once battle is joined.
Deepen (contract). Narrow the frontage and stand deeper: an 8-wide Block of depth-3 Bases closes to a 4-wide Block of depth-6 Bases, freeing the vacated flank hexes. The added depth immediately dilutes the Block's cohesion Fatigue (§6), so contracting buys staying power at the price of frontage and overlaps — Epaminondas massing his left fifty deep.
Widen (extend). The reverse: spread to a broader, shallower line (needs clear hexes to extend into), trading staying power for frontage and overlaps — the extended or refused wing.
Cost. Reforming reorders the ranks under the general's hand, so each rank of the reformed Block takes +reformFatigue Fatigue (the tunable base cost, mirroring the merge seam), scaled by the Block's articulation (below). Fatigue pools as in split/merge — deepened Bases average the files they absorb; widened Bases inherit the shared average.
Only out of contact. A Block in contact cannot reform: deepening or extending needs a lull, which is why a mid-battle redress (Scipio matching the veterans' frontage at Zama) must first disengage. Depth is a formation you commit to and can only re-cut when free of the enemy.
Articulation — not every army re-cuts equally (v3.8). How readily a formation re-forms is a property of its troop type, in four classes. Drilled troops (the Roman-style articulated line) reform at half cost; trained (the neutral default) at full cost; massed (the deep, ponderous pike phalanx) at double cost; and inarticulate troops — a Gallic or German warband, a mass that commits to its shape — cannot reform at all. This is the "a great phalanx cannot turn quickly" tax carried onto depth-cutting: a legion re-forms its maniples almost at will, a horde is stuck with the formation it charged in. (Type → class is an army-list knob; the default maps heavyInf drilled, pike massed, warband inarticulate, the rest trained.)
Reliability — quality carries it off (v3.8). A reform is not automatic: the Block rolls an execution test — its quality dice against its own Fatigue (drilled troops test easier, massed harder). Elite troops re-cut smoothly; a tired or levy formation may fumble it. A failed test aborts the reform — the formation stays as it was — but the botched shuffle still costs the reform Fatigue and denies the Block recovery that turn (as a failed move test does, §6.1). So ordering a re-cut with worn or raw troops is a real gamble, and a re-dress is safest done fresh and early.
6.3 Density — the three orders (v3.14)
Depth (§6) is one formation axis — ranks front-to-back; density is the orthogonal one — how tightly the rank is packed, the tacticians' three intervals. It is the receive-vs-manoeuvre dial, a per-Base state:
Density does three things, all tunable:
order term of missile protection; open order is loose — −1. So a hoplite that locks shields shrugs off arrows a loose line would bleed to.Changing order. A Block shifts density one step (open↔fighting↔close) in the Move phase while not in contact, at a structural cost of density.changeFatigue per rank (dressing or opening the ranks). The change ends the Block's move — it halts to form up. Only drilled, shield-bearing types can shift at all (density.formsClose: heavy foot, pike, medium foot, cavalry, cataphract); light foot are fixed open (dispersed by nature) and the warband is fixed fighting (it neither locks shields nor skirmishes). So bracing to receive is a drill the phalanx and legion have and the horde does not. (Config: density.missileOrderMod, density.meleeMod, density.changeFatigue, density.formsClose.)
7. The Combat Axes — Overview
Before the detailed combat rules, the four axes in one place. A combat is resolved base by base; for each engaged pair:
Quality (dice). Each Base rolls its quality dice and keeps one result (Section 3.1).
Position (flat modifiers). Add overlaps, flank, rear, and high-ground modifiers to the kept result (Sections 9.3–9.4, 8).
Weight (result-shift). After comparing, shift the outcome by the weight difference (Section 9.4).
Special rules. Apply any that trigger — shock, evade, steady spears (Section 11).
8. Terrain
Terrain has two independent properties: Going (footing) and Elevation (flat or hill), both on the 1–5 scale.
8.1 Going & movement cost
Going values: open 5, light woods 4, heavy woods 3, rough ground 2, swamp 1. The Fatigue cost to move through terrain is the unit's weight minus the Going value, minimum 0.
| Terrain (Going) | Knight (5) | Hoplite/Roman (3) | Skirmisher (1) |
|---|---|---|---|
| Open (5) | 0 | 0 | 0 |
| Light woods (4) | 1 | 0 | 0 |
| Heavy woods (3) | 2 | 0 | 0 |
| Rough (2) | 3 | 1 | 0 |
| Swamp (1) | 4 | 2 | 0 |
Open ground is free for all; skirmishers pay nothing anywhere; heavy troops pay steeply in bad ground. No “impassable” rule is needed — the escalating cost is the deterrent (a knight breaks crossing a forest in ~3 tiles). Reserve a flat Impassable flag only for true obstacles (cliffs, deep water).
8.2 Weight-cap in combat
A Base's effective combat weight is capped at the lowest Going value any of its Bases touch. A knight in heavy woods fights as weight 3; in swamp as weight 1 (equal to skirmishers). Per-base: only Bases actually in the terrain are reduced. Skirmishers (weight 1) are never reduced. The same threshold — weight greater than Going — governs both the move cost and this cap.
8.3 Hills (Elevation)
Climbing costs Fatigue by steepness (e.g. slight hill +1, steep hill +2), independent of the Going formula.
The uphill Base gains +1 in combat (a positional modifier, not a result-shift).
Charging uphill negates shock; a downhill charge may keep it.
A hill is firm footing, so it does not cap combat weight.
9. Combat Resolution
Base by base. Each engaged pair of opposing Bases fights its own combat. There is no attacker/defender: the outcome is symmetric, and which Base charged in matters only for shock.
9.1 The combat sequence
For each engaged pair, in order:
Effective weight. Cap each Base's weight at the lowest Going value it occupies (8.2).
Roll quality dice. Each Base rolls its quality dice and keeps one result (3.1).
Add positional modifiers to each kept result: overlaps (9.2), flank/rear (9.3), high ground (8.3), and shock if it applies (11).
Compare totals to get the raw difference.
Apply the weight result-shift (9.4): the difference in effective weight (in the heavier Base's favour, capped at 2) tips the totals — it decides a close result and is part of the winner's output.
The loser absorbs the winner's output (v3.14). The lower final total loses. The margin the loser must allocate is the winner's final total minus the lower of the two raw quality rolls — the winner's kept die + its positional modifiers (9.2–9.3, 11) + its weight shift, less the smaller of the two Bases' raw dice (the floor both shared before position and weight), never below 1. So the loser takes the winner's earned output above the common floor, not a bare totals-difference. This is what makes a fight resolve: it settles decisively each round instead of trading a single point a turn and stalemating (the failure the old raw-margin model produced once give-ground got cheap). The loser allocates the margin (9.5); then check breaks.
9.2 Overlaps — the keystone
Each Base has one front hex and two oblique-front hexes (edge facing, §2). In the Combat phase each engaged Base fights one enemy straight ahead, across its front hex; any enemy that bears on it from an oblique-front — and is not itself fighting someone straight ahead — laps it, +1 to that enemy's side in the fight. A lap is read from the lapper: a Base with an enemy on its own front is fighting, not leaning. Net your side's laps against the enemy's.
Everybody counts (v3.17). Where two Bases of the same side have the same enemy straight ahead, one of them fights it 1-to-1 and the other laps it — no Base in contact is wasted.
There is no cap on overlaps. A Base overhung from both oblique-fronts is lapped twice; a Base taken in flank or rear — whose frontal arc is empty of a fight — can be lapped from both obliques at once. Overlap stacks with flank/rear (§9.3): position compounds, and an enveloped Base collapses rather than grinds.
This is why cohesion wins: a solid Block laps the ends of a fragmented enemy, and push-back strips overlaps, cascading disadvantage into the next combat resolved — which is why combat order (Section 4) is a skill.
9.3 Flank & rear
Which faces these are is the geometry's business (§2): under edge facing a Base has two flank faces and one rear face, and its whole frontal arc — front plus both oblique-fronts — is penalty-free. An enemy that comes round onto an oblique-front has not turned your flank; it has only overhung you, and its bite is the overlap (§9.2). Turning a flank means reaching a true flank or rear face.
Flank. Attacker +1, defender −1; the defender cannot count overlaps on the flanked side.
Rear. Attacker +2, defender −2; the defender counts no overlaps at all. Cascade: if a rear-attacked Base loses by 2+, the whole Block also gains Fatigue +1.
Every enemy in contact tells (no free-riding, no cap). A Base is struck in flank or rear by every enemy whose front edge bears on that edge — not merely its paired opponent. Light cavalry that swings onto an exposed flank bites the fight already joined: its penalty is added to that fight without a separate roll of its own (it shares the result rather than fighting a second combat). So no attacker in contact is wasted and none is capped — a Base fronted by one enemy and flanked by another takes both, an enveloped Base takes the sum of every exposed edge. A formation attacked from several sides does not fight each attacker in turn on equal terms; it comes apart.
“A formation that is struck in flank or rear is no longer a formation.”
9.4 Weight result-shift
Weight is deterministic, not lucky: it is applied after the dice as a shift to the margin in favour of the heavier Base, equal to the difference in effective weight, capped at 2. A Light that ties a Heavy on the dice still slides to a loss. (This subsumes the old troop-type combat factors: 'light foot weak in melee' and 'mounted ride down loose foot' are simply weight differences.)
9.5 Outcome — fatigue or ground
The margin of loss is a number of points. The losing Base's owner allocates each point, freely mixed, as either Fatigue or push-back:
Fatigue (hold). One Base's worth of Fatigue on the losing Base, staying in place — cushioned by the Block's average, and diluted across the Base's depth (a depth-D Base rises 1/D per point, §6), so a deep or large Block barely feels one loss.
Push-back (give ground). The Base recoils one hex for that point (§9.6), up to the pairing cap below. The recoil itself carries no Fatigue — the point is paid in ground, not disorder. But push-back is always a split, so unless the Base is alone or evading (§9.6) the seam Bases each take +1 Fatigue (incidental), and you cede ground and any overlaps.
The give-ground pairing cap (v3.16). A recoil launders a loss only if it is paid for by Fatigue taken: you may give ground for at most as many points as you also absorb as Fatigue. So a defeat can never be shed wholly as ground — at best half goes to recoil and half sticks (margin 1 → 1 Fatigue and 0 back; 2 → 1 and 1; 3 → 2 and 1; 4 → 2 and 2). This is what makes a fight resolve: a unit run down to its break line can no longer trade a single point a turn forever — the un-launderable half is Fatigue it must take, so a beaten formation eventually breaks instead of laundering every loss as ground and grinding on for the whole game. Knob pushback.fatiguePerGround (default 1 = one Fatigue absorbed per hex of ground; higher → less laundering; 0 → the old shed-it-all behaviour). This cap replaced the give-ground grind that made real-scale battles run past 60 turns.
The give-ground move cap (v3.9). On top of the pairing cap, a Base sheds ground only up to its own move allowance — a heavy line (move 2) launders at most 2 hexes of recoil, cavalry (move 4) more; recoil is limited by whichever cap is smaller. Margin past the cap is forced Fatigue, even with open ground behind. So lose by a little and you shed roughly half of it near-free; lose by a lot and the overflow past the caps is Fatigue you cannot dodge. It falls straight out of the move rates (config pushback.capHexes; null = the unit's move allowance). A Base that cannot retreat at all (terrain, friends, table edge) is pinned — every push-back point against it is forced to Fatigue.
Fall back rather than break — the default (v3.9). When a loss would push a Block over its break line (§12), the losing player's default is self-preservation: hold each point as Fatigue until the next would break, then give ground instead (up to the caps), so a unit yields ground rather than shatter where it stands. But the pairing cap (v3.16) means fall-back is no longer a free escape: a unit can only launder half a loss, so a small defeat at the break line (a margin of 1 is never laundable) is Fatigue it must take — it falls back and still breaks. Break therefore means beaten and out of room to shed it — cut off the retreat, or beat it by enough that the un-launderable half tips it over. The player may override the default — a deliberate last stand, holding to Fatigue and breaking to anchor a position. (The standing hold-vs-give-ground order a general sets in advance — disposition — belongs to the command layer and is specified there, not here.)
Variance note: there is no cap on the number of points (the margin). Combat variance is controlled instead by the choice of combat die (§3.1) — the averaging die keeps a positionally-neutral fight tight, so a big margin reflects earned position, not a lucky tail, while a flank charge stays fully decisive. (The give-ground cap above limits how much of a margin can be shed as ground, not the margin itself.)
9.6 Push-back, recoil & splitting
Backward movement is never a legal Block move, so a push-back is always a split. Unlike a voluntary split (free, §6.2), a recoil is disorder the enemy imposes, so it pays a recoil seam (defined below): the pushed Base detaches and the seam is always paid — even for a uniform whole-Block push — unless the Block was a single Base (nothing to fragment) or the Base is a Skirmisher using evade (§11.2), which is exempt. There is no free retreat.
Recoil — one hex STRAIGHT BACK, capped at the move allowance (v3.17). A pushed Base gives ground one hex per point, keeping its facing, through its single rear face — the edge opposite its front. There is no side to choose: edge facing gives a beaten unit exactly one way back, which is the way it came. It detaches from its rank (the push-back is a split), paying the recoil seam on each side it tears from a same-Block neighbour (a Base with one such neighbour pays one, a Base between two pays two — lines come apart from the flanks more cheaply than they tear in the centre). Ground is capped at the unit's move allowance (§9.5, v3.9); any point that cannot land — beyond the cap, or blocked by friends / terrain / the table edge (pinned) — is taken as Fatigue instead. There is no longer a multi-rank 'snake' — depth is a stat, not a file, so only the struck Base gives ground.
Detachment, not dissolution. Pushed Bases detach at their seams while un-pushed neighbours stay contiguous as working sub-Blocks (own overlaps, own average). A few pushes degrade a Block into sub-Blocks; only many dissolve it into loose Bases. There is no auto-reform — a broken Block stays broken; reassembly is a deliberate, costly merge (§6.2) in a later Move phase, after disengaging and recovering.
Dislocation breaks a worn thin Base. A dislodged loose Base stands on its own Fatigue (§6): a thin Base near 6 shatters the instant it is shoved out of its Block's averaging, while a deep Base — whose Fatigue rose slowly, diluted across its depth — survives dislocation. That is exactly what holds a ground-down deep file together when a thin line comes apart. Loose Bases also generate no overlaps, so a shattered run loses its stabiliser when most disordered.
Depth is durability, width is reach. A deep Base's slow-accumulating Fatigue keeps it whole under pressure and through dislocation, while width buys overlaps and hitting power — the same Bases either concentrated deep or spread wide. Depth also lends a modest, scoped combat value — a melee support bonus for close-order troops, or extra fire for massed shooters — set out in §9.7.
9.7 Depth support (melee) & the massed-volley trade-off
Depth is not just cohesion (§6) — it also feeds the fight, but how depends on the troops, and a unit gets one or the other, never both:
depthShove, tunable per type) that its own depth meets. The thresholds have widening gaps, so returns diminish — each extra rank is worth less, there is no flat cap for everyone to cluster at, and a specific historical depth still means something. Heavy foot use [2, 4, 8, 12] (depth 2 → +1, 4 → +2, 8 → +3, 12 → +4 — a fifty-deep Theban column ≈ depth 12 → +4); pike are tighter, [2, 3, 4, 6, 9] (the sarissa block rewards each early rank and reaches deeper); most others meet only [2] (+1 at depth 2). This replaces the earlier flat cap min(depth − 1, depthSupportMax), which created a hard optimal depth rather than rewarding the real column. A Base struck in flank or rear draws none — a formation hit from the side loses its depth just as it loses its overlaps.massedVolley ability turns its depth into fire instead: at depth 2 or more it fires a boosted volley (+1, §10) — the sparabara / deep-archer block. In exchange it draws no melee depth support: its depth is arrows, not shove. Fire in depth, fight in one.This is the historical distinction between a hoplite/pike phalanx (depth = staying power and shove) and a Persian archer block (depth = weight of fire). It is an army-list property: massedVolley is assigned per unit, so the same Medium-Infantry type can be either. (Depth now helps through the cohesion reservoir (§6) AND this bounded support — the flat rank support v2's §9.7 deleted returns as an explicit, tunable stat, ending the old rulebook-vs-engine drift.)
10. Missile Combat
Missile fire (range by weapon, §2) rolls the firer's quality die against the target's flat protection — it no longer reads melee weight (v3.14). Only the firer rolls; the target defends on a fixed number built from armour + shield + order, not on weight:
shot = quality die (firer) + weapon power + volley + situation
protection = armour + shield (front arc only) + order (density, §6.3)
Fatigue = max(0, shot − protection) — on the target, never below 0
The loss is never all-or-nothing: because the firer rolls a die, a good roll always bleeds even a shielded heavy — slow attrition, a Persian archer-line wearing a hoplite phalanx over many turns (Carrhae writ small) — while a soft target takes the full brunt. There is no push-back and no return fire in the exchange; the only result is Fatigue on the target, and a Base shot at cannot recover that turn (the competition default; §6.1).
Weapons differ in range and effect (v3.14). Not range alone: the sling out-ranges the bow and hits with concussion, the bow is the steady mainstay, the javelin is short but heavy (all tunable, missile.weaponPower + distances.missileRangeByWeapon).
| Weapon | Range (BW) | Power |
|---|---|---|
| Sling | 5 | +3 |
| Bow | 4 | +2 |
| Javelin | 2 | +3 |
Protection is decoupled from weight (v3.14). Missile-vulnerability tracks armour, shield-coverage and formation order — not mass. So a warband (heavy in melee but unarmoured) is soft to arrows while a cataphract (armoured horse) is near arrow-proof, though both are 'heavy'. Protection has three parts, tunable per troop type (missile.protection):
Situation (v3.14). A shot bearing on the target's flank negates its shield; from the rear, its shield and its order. Close range (within missile.pointBlankRange) adds +1; at the edge of range, −1. (Enfilade down a file's depth, a spent javelin quiver, and the unshielded-right asymmetry are noted for a later pass — not yet modelled.)
Massed volley (fire in depth). A shooter with the massedVolley ability (§9.7) that stands depth 2 or more adds +1 to its volley — the depth of a Persian-style archer block turned into weight of fire. There is no separate rear-rank Base to feed the shot and no front-rank-only restriction: depth is a stat, so a deep massedVolley Base simply fires the boosted shot. A massedVolley unit forgoes melee depth support in exchange (§9.7). Weapon range, the volley bonus, and the depth at which it triggers are all playtest knobs.
11. Special Rules
The exceptions to the core. Each is a single trigger → effect.
11.1 Shock
Trigger: a unit with the Shock ability (cavalry, or shock-armed infantry such as warbands) makes contact on a chained second move after a full first move (Section 5.3). The charge is thus an extra move — already paid for in Fatigue and able to fail.
Effect: attacker +1, defender −1 — or +2 / −2 against formed infantry that is not spear-armed. Shock applies only on the first round of contact.
Negated by: steady spears to the front (11.3) and charging uphill (8.3).
Vulnerability. After the first round shock ends, and the unit counts no overlaps unless supported by its own kind — so it fares badly in a prolonged grind and simply takes normal combat results. No bespoke post-charge Fatigue penalty: the charge already cost Fatigue.
Pursuit (mandatory). If a Shock Base wins and the enemy is pushed back or breaks, and it is not otherwise engaged, it must advance one full move toward them (no test, no Fatigue) — possibly into a new combat, or into an enemy flank or rear. The cost of overreach is the exposed position it ends in, not a bespoke penalty.
11.2 Skirmisher evade
When a Skirmisher would take Fatigue or be pushed back, it falls back instead — trading ground for cohesion, so it never accumulates melee Fatigue. But it can be caught (charged by faster troops, or pinned so it cannot fall back the full distance), in which case the evade fails and it takes the full result including the weight shift; and it cannot hold ground or objectives.
11.3 Steady spears
A formed, spear-armed Heavy Infantry Base (at least one same-Block neighbour) negates a frontal cavalry charge's shock and gains +1 against mounted. Spear walls stop horses.
11.4 Light cavalry
Light Cavalry do not gain shock and may choose whether to pursue (rather than being forced to). They create flanks, harass rears, and chase routers.
11.5 Massed volley
An army-list ability for deep missile formations (the Persian sparabara / archer block). The unit turns depth into fire (a boosted volley when it stands 2+ deep) and draws no melee depth support — full rule in §9.7 and §10.
11.6 Pursuit (v3.11)
Rout's mirror, and where the killing is done: ancient casualties were light in the fighting and catastrophic in the pursuit. A live unit that is not engaged with a live enemy but has an enemy router within catch-reach pursues automatically — the blood is up. At the start of its owner's turn (after its own routers flee, §12) each such unit resolves pursuit:
moveDistance + panicBonus, so cavalry keep pace and stay on the fugitives while foot fall behind and lose them. Cavalry are the annihilating arm because they don't let go, not because any blow is fatal.pursuit.disorderFatigue — ranks break up into a crowd of chasers. A long pursuit leaves a unit far away and disordered, brittle if it re-engages or is counter-charged (the Spartan virtue of not over-pursuing; the counter-attack on scattered pursuers). Recoverable once it halts and reforms.Rally is deferred to the command layer (§12). This generalises the older automatic shock-pursuit (§11.1).
11.7 Impetuous (v3.12)
An army-list ability for troops that cannot patiently hold — the Gallic / warband charge. At its owner's turn-start an impetuous unit not already in contact must pass a control test (its quality die ≥ impetuous.restraintTarget, default 5, so restraint is the exception) or it surges: it advances one move straight at the nearest enemy. It does not keep chaining moves and exhaust itself closing — one move per turn, no tempo — unless that move leaves the enemy within one further move's reach, in which case it takes the extra charge move into contact, paying the chained-move tempo (§5.2) and delivering shock (§11.1) if it is a shock unit. Impetuosity is hard-baked — no order can restrain it; it is the engine's, not the general's, and it is why a general-less battle still moves: the impetuous make the running while the disciplined hold.
12. Collapse, Break & Rout
Break. A Block breaks the instant its average Base Fatigue — total Fatigue ÷ Σ depth — exceeds 6 (§6). The Block dissolves and its Bases rout — they do not leave the board (§"Rout" below, v3.10); each becomes a fleeing Base that streams away by rule on its owner's turn.
Fall back rather than break (v3.9). A Block does not shatter where it stands if it can still give way. By default a losing unit sheds a break-inducing loss as ground rather than Fatigue (up to its move-allowance cap, §9.5) — so a break happens only when the unit is beaten and cannot recoil: pinned against terrain, friends, or the table edge, or hit by a margin that overwhelms even a full cap of ground. A commander may choose a last stand — holding to Fatigue and breaking — to anchor a position, but that is now a decision, not the automatic result. This is what makes envelopment, not frontal shoving, the way to destroy a formation: cut off the retreat and the fall-back valve closes.
Break is by that average only — there is no per-Base ceiling. A contact Base shoved to high Fatigue inside an otherwise-fresh Block averages down and survives; a Base only breaks on its own Fatigue when it is alone (a single-Base Block, or a loose Base dislocated by push-back, §9.6). A deep dislodged Base endures — its Fatigue rose slowly, diluted across its depth — while a thin one, already near 6, shatters at once.
Rout — routers stay on the board and flee by rule (v3.10). Routed Bases cannot act, form Blocks, merge, or provide overlaps or support, but they are not removed — they remain on the field and flee automatically, because ancient battles were decided in the rout and pursuit, not the fighting. On its owner's turn each routed Base flees a full flee move (moveDistance + panicBonus), in two phases: first directly away from the nearest enemy (blind panic), then, once no enemy is within regroup range, toward its home edge (the line of retreat, derived from its side's deployment).
rout.contagionFatigue, per rank) and may itself rout (the cascade). A well-handled army flees its routers around its reserves, not through them (Zama); one that lets them stream back through the line pays for it.rout.armyBreakWeight knob can weight them more heavily). Rally is deferred — a routed unit re-forming needs a general's intervention and a lull, which belongs to the command layer; until then rout is terminal, which is what the record shows. The pursuit that chases and runs fleeing troops down is §11.6.12.1 Army break & collapse contagion
An army that has lost enough of its starting manpower loses — measured in Bases (Σ depth), so breaking a depth-D Block counts as D Bases lost, not one hex. The threshold declines as the battle drags: a fresh army fights on (50% by turn 10) but breaks ever more easily as it tires (40% by turn 20, 30% by turn 30, 20% thereafter) — the schedule is a config knob, with a flat 30% as the fallback. This resolves long frontal grinds instead of stalemating at the turn cap; it is a decisiveness dial, orthogonal to who wins. On reaching the threshold the remaining Blocks gain Fatigue +1 and any further push-back becomes a break; the battle is decided.
Morale weighting — not all Bases are equal (v3.16). The manpower counted toward the break fraction — numerator and the starting denominator — is weighted by quality: elite ×2, regular ×1, levy ×0.5 (config armyBreak.qualityWeight; all 1 = raw headcount). Losing the elite spine of an army shakes it far more than losing an equal weight of levy — so an army can break when its best troops and its general go down, even at a modest raw count, while a levy-heavy line must lose more bodies to reach the same morale collapse. This is the mechanism behind decisive‑element battles: at Leuctra the deep oblique destroys the Spartiate elite and Cleombrotus (~14% of Sparta by raw headcount but its whole spine), and that — weighted — breaks the Spartan army before the deep hammer itself gives, so the concentration pays. It is an interim, value-weighted proxy for the fuller command-node / general-loss morale model (deferred to the command layer): losing the commander should be the sharpest shock of all, and lands there once generals are modelled.
Local contagion: when any Block breaks, every friendly Block within one base-width gains Fatigue +1, so a broken wing rolls up the line. (The depth reservoir does not damp contagion — a deep block resists its own disorder but still catches a neighbour's collapse; watch it in playtest.)
13. Playtest Parameters (Deferred)
These are empirical balance knobs, set with figures on the table rather than reasoned abstractly. Starting points only:
Combat die. Averaging die (faces 2,3,3,4,4,5) is the ranked standard; plain d6 is the optional high-swing mode. This — not a margin cap — is the variance dial (§3.1).
Quality on the averaging die. Accept that quality reads as consistency rather than power; add a distinct Elite/Levy mechanic (reroll, or best-of-three) only if Elite feels pointless in play.
Shot-at denies recovery. Stricter (denies) is the competition default; the lenient toggle exists.
Free-repeat push-back. No extra per-push cost; the only hard stop is room (edge → pin → break). Add a cost only if turtle-retreat appears.
Mandatory pursuit & contagion. Run as written; consider making non-Light pursuit a choice or capping distance if it produces no-counterplay runaways.
Follow-up. Emergent and fatigue-gated by ruling (decisions-log §9, 5 Jul 2026) — not a bespoke rule. A beaten Base that gives ground breaks contact (§9.6, no auto-reform); to renew the fight the winner must move back into contact next turn, which takes the movement test against its own Fatigue and forgoes recovery (§6.1). A tired winner fails the test or elects to rest — so the fighting pulses, bouts broken by lulls, as the durability of real close combat implies. Shock pursuit (§11.1) is the deliberate exception (automatic, no test). The retired alternative — a one-hex winner follow-up bolted onto combat resolution — would erase the lull and is not to be added; if disengaging proves too easy, tune the recovery/Fatigue numbers, not the rule.
Setup. Army ~24 Bases/side (12 fast); board ~24 × 16 BW; a few terrain pieces placed before deployment; alternate deploying within ~4 BW of one's own edge. Victory: 30%+ Bases lost, by base count.
14. What Changed from v1
Quality is now dice in combat as well as movement; the flat quality matrix is removed.
Troop types now differ in combat via a weight result-shift (1–5 ladder), subsuming the earlier ad-hoc type interactions; only steady spears remains as a type special rule, and warbands are modelled simply as Shock infantry.
Terrain added (Going/Elevation, movement cost, combat weight-cap).
Movement now charges Fatigue for difficult and extra moves; the first move is free and the movement test gates only extra moves.
Shock redefined as contact on a chained second move (no half-move rule), so a charge is paid for and can fail.
Fatigue is now tracked per Base; a Block's cohesion is the average of its Bases' Fatigue and it breaks when that average exceeds 6. Mass therefore absorbs distributed pressure (a volley no longer sums to an instant break) and big intact Blocks are resilient. Merging combines pools instead of taking the higher value.
Fatigue persists on the Base through push-back — because fatigue is per-Base, it cannot be shed by giving ground and re-closing.
Sequence of play, base-width scale, depth/rank support, army break, and collapse contagion added.
Spatial substrate set to a hex grid with vertex-facing (replacing the square grid), specified separately; the rules stay geometry-agnostic. In-place re-facing (the ±60° pivot) is free by default — a tuning knob.
Wheeling added (§5.5): an atomic 60° turn about a flank pivot, cost governed by the farthest corner — ceil(max(frontage−1, depth−1)/move) chained moves with per-move tests. Practical only for small units; large blocks reorient by pivot or by splitting into sub-blocks (§6.2).
Column follow-the-leader march added (§5.6): a column slides along the leader's traced path (each unit inherits the position/facing of the one ahead), turning corners at no frontage penalty — the mobile counterpart to the line's costly wheel.
Split/merge primitive added (§6.2): split or merge legal Blocks at will in the Move phase, paying +1 Fatigue per Base on each side of every seam (per Base, no Block cost). It is how you reorient a large formation (split → move sub-Blocks → re-merge), replacing any wheel-the-whole-block or form-line maneuver.
Combat outcome (§9.5): each point of the margin is taken as either +1 Fatigue (hold in place, absorbed by the Block average) OR a base-depth push-back (give ground). Push-back carries no Fatigue itself — only an incidental seam cost if it fragments the Block. Magnitude/balance flagged for playtest tuning.
Judgment calls flagged for playtest: shock is written as a flat modifier for speed (it may instead be an extra die per the Evaluation); default weight ratings are starting points only.
14.1 What changed from v2 to v3 (design-review ledger — consolidated 3 June 2026)
Combat die is now the averaging die (2,3,3,4,4,5) as the ranked standard, d6 the high-swing option; movement stays d6. The d4 tier and no-dice mode are dropped, and there is no margin cap — variance is controlled by die choice. Quality now reads as consistency, not power.
Recovery is per-Base, plus a new per-Block, average-preserving smoothing pass (a Fatigue-1 Base pulls 1 from the highest 3+ Base; one donation per donor per turn). 'Shot-at denies recovery' is the competition default (toggle).
Push-back is always a split (no legal whole-Block backward move); the seam is always paid (multi-Base). Recoil is a snake the defender steers; the file stays an intact sub-Block; detachment degrades a Block into sub-Blocks with no auto-reform. Single-Base and Skirmisher-evade are exempt.
Overlap is restated for the vertex 2-front/2-side/2-rear hex, with the active-player pairing rule. §9.7 rank support is deleted (depth helps via recoil and smoothing). Phase symmetry made explicit: both sides shoot and fight; only the active side moves and recovers.
Missile is now a weight-vs-weight exchange (quality dice + weight shift, Fatigue-only, no positional mods); heavy targets shrug off fire. Victory: lose at 30%+ of starting Bases (base count). Break is by Block average only — no per-Base ceiling.
14.2 What changed from v3 to v3.1 (rules-pass reconciliation — 5 July 2026)
A pass to bring the rulebook back in step with the implementation (the engine had moved ahead) and to add the sparabara/deep-archer case surfaced by the army lists and the factor-fidelity review (docs/design/factor-fidelity-review.md):
Depth support revived, scoped (§9.7). v2 deleted flat rank support; the engine kept a depthSupportMax, so the text was stale. Depth support returns as a bounded melee bonus for close-order troops (+1 per supporting rank, cap by type) — a Base struck in flank/rear loses it. Depth still also helps via recoil and smoothing (§6.1, §9.6). This resolves the v3 contradiction in favour of keeping the (scoped) bonus.
Massed volley (§9.7, §10, §11.5). New army-list ability massedVolley: a deep missile block fires in 2 ranks (+1 to the volley when a same-type shooter is directly behind) but draws no melee depth support — "fire in 2 ranks, fight in 1." Models the Persian sparabara / archer block, whose depth was weight of fire, not shove.
General rules, army-specific abilities (§3.3). Made explicit that armies customise troops through abilities on the army list; the type sets defaults, the list tunes the unit.
Missile range is per weapon (§2, §10). javelin 2 / bow 4 / sling 5 BW (generic 3), matching history (slings out-ranged bows) and the engine — replacing the old flat "range 2 BW."
Army break declines over time (§12.1). The break threshold falls as the battle drags (50/40/30/20% by turn), a config-schedule decisiveness dial with a flat 30% fallback — documenting the engine's behaviour.
Pike and Chariot troop types (§3.3) added to the type table (already in the engine): pike as the deep sarissa block (heavy, steady spears, high depth cap), chariot as impetuous shock.
14.3 What changed from v3.1 to v3.2 (follow-up ruling — 5–6 July 2026)
A small pass that settles the last-standing deferred combat knob and adds balance-neutral flavour/telemetry. No new mechanics:
Follow-up settled as emergent, not a rule (§13). The deferred "winner follow-up" knob is retired rather than deferred (decisions-log §9, 5 Jul 2026). The durability argument — fit fighters cannot sustain more than ~15 minutes of active shoving, yet ancient battles ran for hours — implies the fighting pulsed: bouts of contact broken by lulls. So there is no bespoke follow-up: a beaten Base breaks contact on give-ground (§9.6, no auto-reform), and renewing the fight is an ordinary move that tests against the winner's own Fatigue and forgoes recovery (§6.1) — a tired winner fails the test or elects to rest. Shock pursuit (§11.1) remains the deliberate, automatic exception. Whether the pulse emerges is left to telemetry (bouts per melee, lull length, declined-follow-up split); if disengaging proves too easy, the lever is the recovery/Fatigue numbers, not a new rule. (The matching §13 wording shipped with the v3.1 pass.)
Unit names & fatigue telemetry (no rules effect). A Base may carry an optional cosmetic name (Spartans, Sparabara, Immortals, Median archers, Saka horse archers, …); the engine never reads it, so balance is untouched — it only restores the colour of a mixed-nationality army over the flat troop types. Telemetry gains shooting- vs melee-inflicted Fatigue and a volley-shot counter (a massed volley raises Fatigue-per-hit, not shot count), so the missile-damage the raw shot count missed is now visible.
14.4 What changed from v3.2 to v3.3 (massed-volley fix — 6 July 2026)
A correctness fix to the massed volley (§10), found in playtest:
massedVolley block fires. The rank behind feeds the front rank's volley (the +1) and must not loose its own separate shot — it is the front rank's ammunition. A two-deep archer block therefore makes one boosted shot per file, not two shots (a boosted front shot + an unboosted rear shot, which was the bug). Engine: a massedVolley Base with a same-type Block-mate directly in front is a rear rank and cannot fire (§10). Balance effect on the deep Greek-vs-Persian board (first-mover-balanced): Greek ~35 % → ~48 % — the double-fire had been inflating Persian missilery. Conformance fixture updated. (The missile weight calculation was reviewed at the same time and is correct as written — both Bases' effective weights feed the capped §9.4 shift, which favours the heavier; the client shot log now shows both weights so the firer's weight is visibly in the sum.)14.5 What changed from v3.3 to v3.4 (combat gang model — 7 July 2026)
A combat-adjudication change to §9.2/§9.3, found in playtest: a light-cavalry unit that had manoeuvred onto an end hoplite's flank contributed nothing — the fight read as an equal frontal duel — and, worse, the flanker (and any surplus unit in contact) simply did not fight at all. The old model paired combatants strictly 1-to-1, honoured flank/rear only from that one paired opponent, and capped overlap at 0/1. That made position wash out and reduced fights to grinds.
Every enemy in contact contributes; nobody in contact is idle (§9.3). A Base is now struck in flank/rear by every enemy whose front edge bears on it, not just its paired opponent. A flanker with no frontal fight of its own lends its flank penalty to the fight already joined (added without a separate roll) instead of being discarded. This is the "gang modifiers, one roll" resolution.
Overlap is uncapped (§9.2). The old "each engaged Base contributes 0 or 1" ceiling is removed. A doubly-overhung front is lapped twice; a Base taken in flank/rear (both front hexes free) can be lapped from both. Overlap and flank/rear now stack with no cap, so envelopment is decisive — variance is still governed only by the combat die (§3.1), not a positional cap.
This reverses the short-lived flankWrapOverlap experiment (removed the same day) — a flank attack now bites through the clean §9.2/§9.3 model (all-contacts flank/rear + uncapped overlap), not a bespoke wrap term. The flank/rear penalty is bounded only by geometry (a Base has four non-front edges). Depth support (§9.7) is likewise denied by a flank/rear hit from any attacker, not just the paired one.
14.6 What changed from v3.4 to v3.5 (seam economy — split free, merge flat — 8 July 2026)
A tuning change to the split/merge seam (§6.2), motivated by the same instinct that removed the push-back double-charge (v3.1, §9.5): breaking a formation should be cheap, and the cost should sit on re-forming order, not on losing it.
Splitting is now free (§6.2). The voluntary split primitive no longer charges a seam. Coming apart into legal sub-Blocks in good order costs nothing; only merging pays. This also halves the cost of the standard large-block reorientation drill (split → move sub-Blocks → re-merge), which now pays only the merge half — a deliberate softening of big-block rigidity, to be watched in sim against the wheel costs (§5.5).
Merge cost is flat per Base (§6.2). A Base on the join takes +1 Fatigue once, however many across-seam neighbours it has — previously it paid +1 per adjacency, so an interior seam-Base bordering two of the other Block was charged +2. Merging a wide join is still expensive (every seam-Base pays), but linearly, not quadratically.
The recoil seam (§9.6) is unchanged and now stands on its own. A push-back is disorder the enemy imposes, so it still pays its edge-1/middle-2 recoil seam; that rule no longer derives from the (now-free) voluntary split. Whether push-back's incidental seam should also go to zero is a separate question, bundled with the deferred push-back-magnitude tuning (decisions-log §5 & §14). Engine: applyMergeSeam (flat per Base) replaces applyCrossGroupSeam; applySplit charges nothing. Split/merge and conformance tests updated; 164 engine tests pass.
14.7 What changed from v3.5 to v3.6 (recovery = no rest while acting — 8 July 2026)
A §6.1 gap fix. The recovery rule denied rest only for moving, being in combat, or being shot at — it was silent on firing and on rear-rank participation, so a Base that shot this turn, a massed-volley rear rank feeding the front's volley, and a rear rank lending §9.7 melee depth support all still recovered. That reads as "acting while resting," which is wrong.
Recovery now requires the Base did not act at all (§6.1). In addition to the old deniers (Block moved/attempted, Base in combat, Base shot at), a Base does not recover if it fired or fed a volley (§10) or lent melee depth support (§9.7). A genuinely uncommitted Base still recovers — the "rotate worn Bases back to rest" tactic survives — but you must pull a Base out of the firing line or the support file to rest it; propping the line and resting are not simultaneous.
Design note (watch in sim): this narrows the recovery reserve a deep formation banks — its supporting rear ranks no longer heal while the front grinds — and means troops in a continuous firefight (already denied by shot-at) don't heal on their own firing either. Both tighten the durability-vs-recovery balance the build exists to tune. Engine: recoverInto also skips firedThisTurn; applyShoot marks volley feeders, applyCombat marks depth supporters. Two recovery-denial tests added; 168 engine tests pass. Ruling in decisions-log §16.
14.8 What changed from v3.6 to v3.7 (depth becomes a Base stat — 18 July 2026)
The largest structural change since the hex substrate. Depth stops being geometric — Bases physically stacked in files behind the front — and becomes a per-Base stat measured in Bases: a depth-D Base is D Bases stacked in one hex. Frontage stays geometric (a Block is still a rank of side-by-side Bases, so overlaps/flank are unchanged), collapsing the spatial model from two axes to one. This closes two long-standing issues: the "what is the real mechanism behind smoothing / the donor should be the base behind" playtester objection, and the rulebook-vs-engine drift where a depth-support bonus was smuggled in as geometry (it is now an explicit, honest stat).
Σ(depth·Fatigue) / Σ(depth), and it breaks past 6 — so it absorbs 6·Σdepth total Fatigue (a depth 3+2+1 block = 6 Bases, absorbs 36). A combat loss dilutes across the loser's depth (a depth-D Base's Fatigue rises 1/D per point), so deep endures; movement cost is still per-Base (the whole formation marches). A wide Block and a same-size deep Block are identically durable — depth just trades frontage for a compact footprint. (There is no "reference depth": a lone Base (depth 1) behaves exactly as in v3.6.)min(depth − 1, depthSupportMax) on a front-struck Base; a massedVolley Base fires its boosted volley at depth ≥ 2 (no rear-rank feed, no front-rank-only rule). The support/volley trade-off is unchanged.frontage − 1 BW plus a depth manoeuvre penalty (depthWheelPenalty × (depth − 1)) — a deep body is still ponderous. Column march and the line↔column flip survive unchanged (they always operated on the frontage row, not the depth stack).reform command — widen & deepen (§6.2). With depth a stat, split/merge only change frontage, so depth is now managed by reforming: a Block not in contact trades frontage for depth (or back), conserving manpower, at +1 Fatigue per Base (reformFatigue). This is the only way to change depth once battle is joined — deepen to buy staying power (Leuctra), widen to buy frontage (the extended wing), redress out of contact (Zama). It is a new decision point for the executor (Doctrine Policy Table) and a new command-mode verb.movement.depthWheelPenalty (0.5), missile.massedVolleyMinDepth (2), fatigue.reformFatigue (1); combatModifiers.depthSupportMax per type. There is no reference-depth knob — cohesion is the plain manpower-weighted average. Full spec: docs/depth-as-a-stat-plan.md. Ruling in decisions-log §18; scenarios regenerate (w×d block → w hexes at depth d, manpower conserved); golden masters re-baseline.Fatigue × reference/depth dilution with a spurious reference-depth knob, inflated scenario manpower 4×, and left army-break counting hexes. Reworked to the base-count model above (manpower-weighted cohesion, combat-loss dilution, army-break by Σ depth); decisions-log §18.total ÷ Σ depth and no fractional per-rank accounting is needed. A combat/missile loss adds one Base's worth (+1 to the total) — its per-rank effect is 1/D, so deep still endures; structural costs (move, terrain, seam, contagion) add +depth (the whole formation pays). This is a storage refinement, not a rule change — it fixed two latent bugs (reform double-counting a deepened Block's Fatigue into an instant break, and a missile hit not diluting like a melee hit). Decisions-log §19.14.9 What changed from v3.7.1 to v3.8 (reform by articulation — 20 July 2026)
Reform (§6.2) stops being uniform. Two orthogonal axes gate a re-cut, each riding on machinery the system already has:
heavyInf drilled · pike massed · warband inarticulate · rest trained (army-list tunable).articulation (type → class) and reformArticulation (per-class {costMult, canReform, testBonus}); fatigue.reformFatigue (1) stays the base cost the multiplier scales. Fatigue stays the integer hex-total (§14.8) — the fractional drilled cost rounds at the hex. Ruling in decisions-log §20; spec in docs/reform-articulation-plan.md. Reform becomes a gamble the M2 doctrine executor must weigh (a new Doctrine Policy Table consideration).14.10 What changed from v3.8 to v3.9 (push-back economy — give-ground cap & fall-back-not-break — 20 July 2026)
The push-back economy was previously uncapped: a loser could shed its entire margin as recoil on open ground and take zero Fatigue, so a defeat's size barely mattered. Two always-on rules fix that (§9.5, §9.6, §12):
pushback.capHexes (null = the unit's move allowance).docs/pushback-economy-plan.md.14.11 What changed from v3.9 to v3.10 (routers stay on the board — rout in place — 20 July 2026)
The largest change to the endgame: a broken Block was deleted — its Bases vanished — which threw away the phase where ancient battles were actually decided (casualties were light in the fighting, catastrophic in the rout: Sabin, Krentz). Now broken Bases rout in place (§12) and flee by rule, per the simulation-not-game north star.
moveDistance + panicBonus hexes: first directly away from the nearest enemy (blind panic), then toward its home edge once clear (the line of retreat, derived from deployment).rout.contagionFatigue), which may chain-rout it (Zama: a good general flees his routers around his reserves).docs/routers-onboard-plan.md; rally deferred to the command layer). Config rout.*. Grounded in FoG/DBx + du Picq/Sabin/Krentz + Cannae/Zama; ruling in decisions-log §22.14.12 What changed from v3.10 to v3.11 (pursuit — the chase after fleeing troops — 20 July 2026)
The pursuit half of #10 (§11.6). With routers now on the board (§14.11), the pursuit runs them down — the phase where ancient battles' casualties were actually inflicted.
moveDistance + panicBonus, so cavalry keep pace and stay on the fugitives while foot fall behind and lose them. No extra-move Fatigue to run runners down.pursuit.disorderFatigue/turn) — a long pursuit leaves a unit far away and brittle.pursuit.*. Rally still deferred to the command layer. Ruling in decisions-log §23.14.13 What changed from v3.11 to v3.12 (impetuous — the warband charge — 21 July 2026)
The first "prototype in the executor, promote to the rulebook" graduation (command-architecture.md §4), and the first hard Layer-0 characteristic added for command mode.
warband). At turn-start an impetuous unit not in contact tests to hold (impetuous.restraintTarget, default 5) or surges one move at the nearest enemy, no tempo — it does not chain moves and exhaust itself closing — taking the extra charge move (tempo + shock) only when that move brings the enemy within reach. Engine-enforced; no order restrains it.impetuous.restraintTarget. Ruling in decisions-log §24. Goldens unchanged (no warbands in the golden scenarios).14.14 What changed from v3.12 to v3.13 (split from an engaged block — 22 July 2026)
14.15 What changed from v3.13 to v3.14 (combat resolves + depth-shove curve — 26 July 2026)
Two combat-model changes, both validated on the canonical-battle distributions (Leuctra, Gauls-Romans, Greek-Persian, Clash — ~100 games each) rather than argued. Together they make combat decisive without inverting who should win.
combat.loserDamage: "normalized"), not the bare difference of totals. Once give-ground became cheap (v3.9), the old raw-margin model let fights trade a single point a turn and stalemate — superior forces could not actually win. Normalising the loss so the beaten side takes the winner's earned output above the shared floor makes every bout resolve: across all four battles the sim now reads 100% decisive, with the loser bleeding 10–25× the winner (rout stays the killer). A consequence to note (flagged in the tests): a flank/rear penalty on the loser no longer amplifies the loss magnitude — only the winner's flank/rear bonus does; position still decides who loses and fires the rear cascade (§9.3).min(depth − 1, depthSupportMax) — a hard cap, so every column clustered at the cap depth and a fifty-deep Theban hammer fought like a three-deep line (Leuctra inverted, the deep left losing 98%). Replaced by a per-type threshold curve depthShove with widening gaps (heavy foot [2,4,8,12], pike [2,3,4,6,9]): each extra rank is worth less, there is no flat optimum, and depth 12 → +4 makes the historical column mean something. The sim fix is clean — Leuctra goes 0% → 50% (a real toss-up, the oblique-order mechanism alive, not curve-fit to a Theban win) while the three shallow-block battles are untouched. Phil's point that depth also conflates reinforcement / rank-rotation / extra-shove is logged for a future richer model; this settles the shove alone. Rulings in decisions-log §26.*14.16 What changed from v3.14 to v3.15 (missilery rewritten + density states — 26 July 2026)
The two Layer-1 mechanics that completed the tactical model before command mode — grounded in the sources and rulesets ([[ancients-simulation-not-game]]), built and validated on the sim.
missile.weaponPower / missile.protection / situational knobs. Sim: bows now decisive against soft/uncatchable targets without inverting a hoplite line that can close.setDensity command (Move phase, out of contact, density.changeFatigue/rank, ends the move), and drill-gated: only the shield-bearers (density.formsClose) shift, light foot are fixed open, the warband fixed fighting. Ties the missile and melee models to formation choice — a phalanx tightens to receive cavalry or arrows, and pays for it in mobility. Rulings in decisions-log §27.*14.17 What changed from v3.15 to v3.16 (give-ground pairing + army-morale weighting — 28 July 2026)
Two mechanics settled from a Leuctra distribution read (the deep-oblique battle, run 100× at real scale). The v3.15 sim had Leuctra grinding past 60 turns and, worse, inverted — the deep hammer destroyed the Spartiate elite + Cleombrotus and kept its refused wing wholly intact, yet was ruled the loser (raw-headcount army-break counted the loss of one depth-12 base as catastrophic). These two changes fix both, validated as a distribution, not curve-fit ([[ancients-distribution-not-curvefit]]).
pushback.fatiguePerGround (default 1). Diagnostic note: the actual Leuctra inversion turned out to be army-morale, not give-ground — this change stands on its own for playability (Leuctra decisive inside 60 turns).armyBreak.qualityWeight; all 1 = the old raw headcount). Losing the elite spine and the general breaks an army sooner than losing an equal weight of levy — the mechanism of decisive-element battles. This is what fixes Leuctra: destroying the Spartiate elite + Cleombrotus (~14% of Sparta raw, but its whole spine → ~30% weighted) breaks Sparta before the deep hammer gives. Leuctra: Thebes 31% → 70%, 100% decisive, robust across elite 2–3×. Collateral, reported honestly: the synthetic clash probe inverts (58→39%) and marathon softens (decisive 99→88%) — both accepted (clash has no historical ground truth; marathon was already Persian-favoured/ahistorical). Interim proxy for the fuller general-loss / command-node morale model, deferred to the command layer. Rulings in decisions-log §28.*14.18 What changed from v3.16 to v3.17 (edge facing — a unit faces an EDGE — 1 August 2026)
The spatial substrate changes: a Base now faces an edge, not a vertex (§2; full geometry in docs/spatial-model-edge.md). Vertex facing gave straight, collinear ranks but had no single forward — a unit could never march straight, only staircase — so an envelopment could not be driven. Edge facing buys a true forward and a straight march. The accepted cost is a sawtooth line: two edge-facing ranks mesh cleanly head-on (both sit on the same grid, so their staggers are congruent) but stop nesting after a wheel, and gaps and glancing contacts appear. This is the third substrate (square → vertex hex → edge hex); the combat maths, fatigue, depth-as-a-stat, break and recovery are untouched — only the geometry moved.
scenario-geometry test that fails if a deployment drifts back to a row). All five use facings 1 vs 4 — armies top and bottom, lines across the board's wide axis, which is the way round a rhombus-drawn board wants them (the vertical alternative cramps frontage against the short axis and fills half as much of the drawn board). Verified on Leuctra: the lines close at 9 BW and mesh 18-for-18, 1-to-1, with Sparta's one spare file becoming an overlap — the historically wider line. Rulings in decisions-log §29.