AI Opponents — Difficulty, Personality, and Being Worth Playing
Status: Design proposal v0.1 · Angle: difficulty, personality, legibility, multiplayer roles ·
Depends on: 00-direction.md, 01-decision-turn-model.md, and the specification set — 01-game-rules (GR),
02-units-and-industry (US), 10-turn-model (TM), 11-combat (CB), 12-economy (EC), 13-command (CM),
14-victory (VC). Clean-room: every number here is mine and is argued on its own terms.
This document owns the difference between a strong AI and a good opponent. It does not own the AI's internal architecture, its plugin ABI, or its search implementation; where it names a mechanism it does so because the difficulty ladder or a personality has to hang on something concrete, and the architecture angle governs how that mechanism is actually built.
The thesis, stated once so everything below can be tested against it:
An opponent is worth playing when you can lose to it and learn something. That requires three things and they are the three sections of this document. The difficulty must be honest, or the lesson is false. The opponent must have a character you can read, or there is nothing to learn from. And the game must be able to tell you afterwards what it was doing, or you cannot collect the lesson even when it is there.
0. Naming, and three collisions that already exist
This document introduces vocabulary into a set that has run out of good words. It uses these, and they collide with nothing:
| Term | Means |
|---|---|
| Rank | An AI difficulty level. Six of them: Cadet, Lieutenant, Captain, Colonel, General, Marshal. |
| Personality | A named set of parameter offsets giving an opponent strategic preferences. Seven shipped. |
| Aim / Operation / Point | The three levels at which an AI decides: empire, theatre, and the individual decisive action. |
| Decisive Point | A unit or small group the AI hand-orders outside the command layer. |
| Intent Record | The per-turn audit artifact of an AI seat's reasoning, sibling to CM's CommandDecisionRecord. |
| Caretaker / Substitute | The two mandates under which an AI may run an absent human's seat. |
Rank, deliberately, is not Tier (US owns Tier for the Industry ladder 1–4), not Grade (CB owns Grade for Green/Trained/Veteran/Elite veterancy), not Class (US owns unit class), not Level (works level), and not Band (VC owns the Rumour/Report/Alarm bands). An AI difficulty level called "Veteran" would be a word already carrying a combat meaning, and CM-007 already had to spend a naming note on exactly that kind of overload. One is enough.
Three collisions in the existing set that this document had to navigate and that the spec editors should settle rather than inherit:
- Posture is CM's standing job (Hold/Garrison/Screen/Survey/March/Attach), Stance is TM's
per-turn tactical setting (March/Advance/Hold/Entrench), and CB §4 uses
posturefor a third enum (Assault/Guarded/Entrenched/Withdraw). CM-007 reconciled the first two. The third is unreconciled. This document uses CM's names throughout and treats CB's four values as the combat-facing projection of TM's Stance. - Doctrine is CM-770's Posture-plus-Sanctions bundle and EC §5's named production ratio. This document uses CM's meaning, and calls EC's object a production Template, which is what CM-1310 already names it.
- Initiative is TM's activation score, and CM-007 already renamed the Sanction that wanted the
word. No further action; noted so the AI's
initiative-shaped reasoning is unambiguous.
1. The problem
Three problems, and the industry solves all three badly.
Problem A — difficulty is usually a lie. The standard difficulty slider does not make the opponent play better. It gives the opponent more resources, better combat odds, or an unfogged map, and calls that Hard. This is worse than it looks. It teaches the player nothing, because the thing that beat them was not a decision. It makes every AI success suspect, because the player cannot tell competence from subsidy. And it destroys the only feedback loop that matters: you cannot improve against an opponent whose advantage is not reproducible by you.
Worse in the other direction: Easy is usually implemented as noise. The AI is given a probability of doing something stupid. The result is an opponent that plays a decent turn and then walks a battalion into a mountain for no reason. Nobody has ever met a human who plays like that. Easy should be a weaker mind, not the same mind with a seizure.
Problem B — personality is usually a label. Games ship "Aggressive Genghis" and "Builder Gandhi" and the difference is a couple of weights that wash out by turn 40, because the underlying evaluation dominates and every AI converges on the same locally-optimal play. The player learns within three games that the label means nothing, and then the roster is decoration. A personality that does not change what the AI does, observably, for the whole game, is a cosmetic.
Problem C — you cannot read your opponent. In a fog game with a competent opponent, the player sees effects without causes. Something is massing in the north. Why? What does it want? A human opponent at least has a plan you could in principle have deduced; most AIs do not have a plan, they have a per-turn utility sum, so there is nothing to deduce and the player's attempts to model them are wasted effort. This is not fog doing its job. Fog should hide where the enemy is, not whether the enemy is a thing that can be understood.
Every one of these is a design failure rather than a technology failure, and each has a design fix.
1.1 The one asset this design has that others do not
13-command.md exists. It specifies, normatively and core-side, how a unit behaves under a standing
job: how a Screen picks its tile (CM-460), how a Survey chooses where to look (CM-500), when a unit
withdraws (CM-660), what happens when a plan meets an obstruction (CM-1340), how production is routed
to a front without per-city clicks (CM-1190). All of it is deterministic (CM-110), integer (CM-120),
fog-honest (CM-130), and — this is the load-bearing part — identical for every player, every
client, and every AI seat (CM-100).
That changes the AI problem from "produce 150 good unit orders" to "produce about a dozen good command-object decisions and hand-order the four or five units where the command layer is not good enough." It is the difference between a problem nobody has solved and a problem that is mostly bookkeeping.
Three of the four properties named in the brief follow from it or reinforce it: the collapsed branching factor is CM; the clean bounded turn function is TM's Orders phase; the deterministic headless core is AR and CB's 0.45 µs exact predictor. The fourth — event-sourced games as training data — matters most for the top of the ladder and I treat it honestly in §11.
2. The three decisions that shape everything else
I want to argue these before describing machinery, because everything downstream follows and each is contestable.
2.1 Weakness is a smaller world model, not a noisier one
Decision: an AI at a low Rank is weak because its evaluation function is missing terms and its planning is slow to re-aim — never because a random draw corrupts its output.
The alternative — utility noise, the standard approach and the one the earlier AI draft specified — fails on its own terms. Noise applied to a good evaluation produces a specific and recognisable artefact: mostly-good play punctuated by decisions with no possible rationale. A human novice does not play like that. A human novice plays consistently, from a model that is smaller than yours. They over-expand, because their model has no term for occupation cost. They assault entrenched infantry, because their model has odds in it but not resolve. They react late, because they only look at a front when something has already gone wrong there. Every one of those errors is systematic, explicable, and learnable-from — which is exactly what noise is not.
So the ladder is built by structured omission. Each Rank's evaluation is a strict superset of the one below, and the terms that are absent are named. This buys four things:
- Weak play looks like weak human play, because it is produced the same way: by not knowing something.
- The difficulty selector can tell the truth about what a Rank does not understand, which is a far better description than "Hard".
- The debrief (§7.3) can name the blind spot the player exploited, which turns a win into a lesson.
- Tier monotonicity is structural rather than accidental: adding a term can only fail if its weight is wrong, which is a tuning bug with a test, not a design risk.
There is one thing omission cannot produce and I add it deliberately: latency. A weak player is
not only ignorant, they are slow to change their mind. So each Rank carries a re-plan interval k
(the empire-level Aim is reconsidered every k turns) and a commitment lock C (an Operation is held
for C turns after its trigger has cleared). Both are deterministic, both are recognisably human, and
both produce the single most characteristic weak-player behaviour — arriving with the right plan two
turns after it stopped being the right plan.
What is forbidden, at every Rank, and this list is normative for whoever implements it:
- No random corruption of a chosen order.
- No deliberate misplay — no "throw this fight" branch.
- No artificial delay in noticing a visible threat. Slowness lives in re-planning, not in perception.
- No provably pointless action. Because CB's predictor is exact (CB §9.1), "an attack with 0‰ break probability and a worse loss trade than not attacking" is a computable predicate, and no Rank may emit one.
2.2 The AI plays through the command layer, and departs from it only at the decisive point
Decision: an AI seat's default output is Postures, Sanctions, Formations, Postings and Requisitions — the same objects a human commits — and the number of units it is permitted to hand-order outside that vocabulary is a per-Rank budget.
This is the spine of the ladder and it deserves the argument.
CM-130's rationale already predicts the human skill curve: "expert players will hand-order at the decisive point. That is the design working, not failing." The command layer is deliberately good enough that delegating costs you little and deliberately fog-honest enough that delegating costs you something at the point where it matters. That is precisely a difficulty axis, already specified, already balanced, and free.
So: Cadet has a Decisive-Point budget of zero. It sets Postures and Sanctions and lets the Cascade run. It is a real opponent — CM's Screen spreads, its Sanctions pick off stragglers, its Requisitions keep production flowing, its Reflexes preserve its units — and it will never win a battle it should have lost, because it never chooses one. Marshal has a budget of sixteen and spends it exactly where a strong human would: the assault that must be timed, the encirclement that must close, the artillery that must be concentrated, the transport that must not be caught.
Four consequences, all good:
- The floor of AI quality is the floor of automation quality. Every improvement to CM improves every Rank, and every Rank's baseline behaviour is behaviour the design has already reviewed.
- The AI has no private tactics. Everything it does at low Rank is expressible by a player, which makes it readable (§7) and makes fairness checkable.
- The compute story becomes honest. The expensive part of a turn — 150 units' movement, pathing, coverage, reflexes — is already paid for by the core (CM-2100: 400 units in 50 ms) and is not the AI's problem at all.
- The ladder has a natural top. Knowing when to leave the command layer is genuinely the last skill a strong player acquires, so a Rank defined by that budget is defined by the right thing.
The rule that keeps this honest, stated hard because it is the fairness contract:
The shared vocabulary rule. An AI's only effect on the world is an order set, identical in kind and legality to one a human could submit in the same state (CM-2040 already guarantees the command layer is entirely expressible as orders). Any AI behaviour that no player can express is a bug and a fairness violation, not a feature.
2.3 Personality is a priced, published offset from a tuned baseline
Decision: one neutral, self-play-tuned parameter set is the baseline. Every personality is a signed offset from it, and the win-rate cost of that offset is measured and published.
The failure mode of personality systems is that nobody knows what the flavour costs, so either it costs nothing (the dials are too small to matter and the personality is cosmetic) or it costs everything (the aggressive one loses every game and the roster is a difficulty selector with extra steps). Both are avoidable by measuring.
So: Aurel is the baseline — no preferences, dials at the tuned optimum. Every other personality declares its offsets, and the self-play pipeline reports its Elo price: its rating loss against Aurel at the same Rank over ≥1000 games. The price is capped at 60 Elo (roughly 58:42 in Aurel's favour), which is large enough for the character to be real and small enough that choosing a personality is choosing an opponent rather than choosing a handicap. A personality whose measured price exceeds the cap is re-tuned or retired; it is not shipped with an apology.
Two corollaries that make personality survive contact with a strong opponent:
- Personality dials are frozen inputs to tuning. The pipeline tunes the shared term-value functions and Aurel's weights; it never tunes a personality toward the optimum, because that is the same as deleting it. After every promotion, each personality's price is re-measured and republished.
- Personality never authorises losing. §6.4 specifies the Override, a hard floor that forces an AI to contest a victory it can see coming, whatever its weights say. A personality that walks into a loss it could read on the Watch is not characterful, it is broken.
3. What the AI actually decides
Enough architecture to hang the ladder on. Three levels, matching the granularity the rest of the design already uses.
| Level | Scope | Output | Cadence |
|---|---|---|---|
| The Aim | The empire | Which Track(s) to pursue; expand-versus-digest; the split of Works between units, Cadre (EC §6) and Industry (US §2.2); Posting weights (CM-1130) | Every k turns |
| The Operation | One theatre — one Posting or Group | One named Operation per theatre, with its geometry, force allocation, and Requisition rows | Every turn, subject to commitment lock C |
| The Point | A unit or handful | Hand-issued Tasks outside the command layer | Every turn, up to budget P |
Operations are a closed, named vocabulary, for the same reason CM-330 fixes six Postures: a larger set would look richer and be used less, and a named set is legible to the player afterwards. Eight:
| Operation | What it is | Chiefly expressed as |
|---|---|---|
| Hold the Line | Deny a frontage; trade space grudgingly | Formation Screen, Pace Concentrated, Risk Cautious |
| Push Axis | Advance along one axis to a named objective | Group March with a Van, Requisition topped up |
| Descent | Cross water and land a force | Ferry Shuttle (CM-535), Landing Ship, then March follow-on |
| Reduce | Take a fortified place by bombardment and assault | Concentrated guns (CB §7.2), then Points |
| Interdict | Cut supply, Cadre, or Depots rather than fight the army | Dispersed raiders on Survey/March, Leash Loose |
| Digest | Stop; garrison, integrate, repair, rebuild Requisitions | Cadre routing, Militia builds, Garrison Postures |
| Relieve | Break an encirclement or reinforce a threatened place | High-weight Posting, March with pressHome |
| Deny | Remove a specific opponent's specific Track progress | Whatever the Track's geography demands |
Deny is the one that would not exist in a game without VC. It is worth having as a first-class
Operation because the victory system publishes enough (the Watch, the Alarm, the Ebb schedule) for
denial to be a plannable objective rather than a reaction.
3.1 The Dispatch is the AI's attention budget
CM-1610 requires the core to emit Attention Events deterministically, per player, from that player's
fog-filtered view (CM-1850). CM-1660 ranks them by an integer Urgency U = S + T + A + P. CM-090
guarantees the presented count does not grow with unit count — median ≤ 5, p95 ≤ 12, at every unit
count from 20 to 400.
So the AI reads its own Dispatch and spends its Decisive-Point budget on it, in the same order the human sees. This is not a convenience; it is three separate wins:
- The attention problem is already solved and already bounded. The AI does not need its own threat-detection pass; CM has one, it is deterministic, and its output is capped.
- The AI and the human are looking at the same list. Difficulty becomes "how many of these can it act on well", which is exactly how it feels to be a better player.
- Legibility falls out. The debrief can say "I saw five items, I acted on three, and here is the one I ignored and why", because the items are named objects with cause keys (CM-1700).
Two adjustments for an AI seat:
- CM-1770's player weight
Pis client-side and outside the canonical hash (CM-180). For an AI seat it is personality data, fixed, never adaptive (CM-1780 does not apply), and it is recorded in the game configuration so a replay knows which opponent it faced. This reuse is exact:Pis literally "what this opponent cares about", which is what a personality is. - CM-1630 still binds: the AI's unit behaviour must not depend on Attention Events. The Dispatch chooses which decisions the AI examines; it never changes what an unexamined unit does.
3.2 The branching factor, arithmetically
The naive statement of the problem: 150 units, each with roughly 24 legal action-and-destination combinations at typical movement allowances on eight-way movement, is 24¹⁵⁰ joint order sets. This is the number that makes people say strategy AI is intractable, and it is the wrong number.
The real statement, through the command layer:
| Quantity | Value | Source |
|---|---|---|
| Theatres (Postings) | ~4, warned at 13 | CM-1150 |
| Named Operations | 8 | §3 above |
| Independently scored Operations | 4 × 8 = 32 |
|
| Joint plans (one Operation per theatre) | 8⁴ = 4096 |
|
| After force- and production-budget feasibility pruning | ~500 | measured, §11.1 |
| Decisive Points | ≤ 16, from a Dispatch capped at ~12 items | CM-090, §4 |
A few hundred coherent plans and a dozen local decisions. That is a tractable problem, and the reason it is tractable is that CM already collapsed it. This is the single most important feasibility fact in the document, and it is worth saying plainly that most 4X AIs do not have it — they lack the command abstraction, so their unit layer and their strategy layer are the same layer and neither can be done well.
4. The ladder
Six Ranks. The one-line descriptions are the difficulty selector copy, and they are honest:
| Rank | It understands… |
|---|---|
| Cadet | its orders |
| Lieutenant | a fight |
| Captain | an economy |
| Colonel | a map |
| General | a clock |
| Marshal | you |
4.1 The knobs
| Knob | Meaning |
|---|---|
H |
Forecast horizon in turns for the closed-form economy and Track projection |
B |
Candidate joint plans scored at the Aim level |
R |
Full-Cascade rollouts spent per turn verifying the chosen plan |
P |
Decisive-Point budget: units hand-ordered outside the command layer, per turn |
A |
Dispatch items examined per turn |
k |
Aim re-plan interval, in turns |
C |
Commitment lock: turns an Operation is held after its trigger clears |
S |
Staleness tolerance: observation age, in turns, the AI will treat as current |
| Cadet | Lieutenant | Captain | Colonel | General | Marshal | |
|---|---|---|---|---|---|---|
H |
3 | 6 | 10 | 16 | 24 | to the Horizon |
B |
8 | 32 | 128 | 512 | 1536 | 4096 |
R |
0 | 0 | 0 | 1 | 2 | 4 |
P |
0 | 1 | 3 | 6 | 10 | 16 |
A |
3 | 5 | 7 | 12 | all | all |
k |
8 | 5 | 3 | 2 | 1 | 1 |
C |
10 | 6 | 3 | 1 | 0 | 0 |
S |
12 | 8 | 5 | 3 | 2 | 2 |
S deserves a note because it produces the most recognisable weak-player behaviour in the game.
CM-160 already sets the fog-honest guard: a predictor with no current observation returns a
conservative 400‰ and flags estimated, and Engagement Favourable will not fire on it. A Cadet
with S = 12 treats a twelve-turn-old contact marker as live and plans against a ghost. That is
exactly what a beginner does, it is entirely fog-honest, and it costs nothing to implement: it is one
comparison.
4.2 What each Rank fails to notice
Cumulative. Each row is a set of evaluation terms; a Rank has every term at or below its row.
| Added at | Terms, and the mechanic each reads |
|---|---|
| Cadet | City count and class (EC §4); own and visible enemy strength; adjacency threat within CM-680's threat radius; free-city detection (CM-1370). One Track only, and only as "hold more cities". |
| Lieutenant | CB's break check, not just the odds ratio (CB §5 step 7) — the difference between "I have better odds" and "they will actually leave"; terrain cover and chaos (CB §6); garrison sufficiency against EC §4's table; observation-age discounting. |
| Captain | The occupation economy: Integration, Unrest, the Cadre cost curve, garrison burden, and Loyalty memory (EC §6); Works-to-Manpower balance and the forced army mix (EC §8); production payback; the Industry climb decision (US §5.5). |
| Colonel | The map: supply Reach and grades (EC §7), Depot chains and their weakest link; encirclement and retreat-tile denial (CB §5 step 8); disorder, rotation and the cost of fighting worn (CB §5 step 9); combined arms and the role × terrain table (CB §6). |
| General | The clock: every enabled Track with its threshold and Vigil (VC §3); the Ebb schedule and counting backwards to a date (VC T1); the Tally calendar and Warrant windows (VC T6, T13); Tenure trajectory and VC §8.2's elimination arithmetic; the Alarm as a priced decision rather than an event. |
| Marshal | You: a per-seat opponent model inferred from its own observation stream; feints and false axes; counter-Vigil timing (choosing when to force an opponent to start a Vigil they cannot hold); second-order plans that advance nothing of its own and remove something of yours. |
Read that table as a description of six opponents rather than six settings, because that is what it is. A Captain will out-economy you and then attack a mountain. A Colonel will cut your road instead, and will still not notice that the Ebb reaches you on turn 178. A General will be there on turn 178.
Human novice errors, and the omission that produces each. This is the plausibility argument made concrete:
| The mistake | Produced by lacking |
|---|---|
| Expands past what it can hold; rear cities revolt around turn 80 | Integration/Cadre terms (below Captain) |
| Assaults entrenched infantry and is thrown back | the break check (below Lieutenant) |
| Fights on the enemy's ground | role × terrain and cover (below Lieutenant/Colonel) |
| Attacks a stale contact marker that is no longer there | low S discipline (below Colonel) |
| Feeds reinforcements in piecemeal | Pace and arrival-synchronisation terms (below Colonel) |
| Never concentrates artillery, so bombardment does nothing | combined-arms terms and CB §7.2's three-battery equilibrium (below Colonel) |
| Ignores an opponent three turns from a Vigil | Track terms (below General) |
| Never cuts a supply line | Reach terms (below Colonel) |
| Keeps pushing an offensive two turns after it stopped working | high C (below Colonel) |
Every one of those is a mistake I have watched people make. None of them is a mistake nobody makes.
4.3 The floors — what every Rank does, including Cadet
Plausible weakness has a lower bound, and it is not negotiable. At every Rank:
- Never leave a city ungarrisoned when a visible enemy is within its threat radius and a garrison-capable unit is idle or in reach. This is arithmetic under CM-010, not a decision.
- Never leave a city's production empty. CM-1220's surplus rule and EC §5's standing production make this free.
- Never strand a unit by rule — an air unit that exceeds
endurance(US §4.2), a transport left in reach of a submarine with no escort, a Cadre moved adjacent to a known enemy (EC forbids it mechanically anyway). - Never decline a genuinely free adjacent city. CM-710's
Seize: Undefendeddefault already does this and CM-301 argues at length why it is arithmetic rather than a decision. - Never make a provably pointless attack — 0‰ break probability with a worse loss trade than not attacking. CB's exact predictor makes this checkable at 0.45 µs.
- Never let a unit sit Idle. CM-540 makes Idle deliberately uncomfortable for a human; for an AI it must be unreachable.
An AI that violates any of these reads as broken, and "broken" is not a difficulty. A beginner who loses a city because they forgot it existed feels bad about themselves; a beginner who watches the AI forget a city feels bad about the game.
4.4 Monotonicity, and the honest gate
Requirement: each Rank beats the Rank below it with ≥ 60% win rate over ≥ 1000 farm games across the benchmark map and preset suite. Structural monotonicity (each evaluation set is a superset) makes this likely, not guaranteed — a new term with a badly-tuned weight can make a Rank worse. So each newly added term is A/B'd at the Rank that introduces it before the ladder gate runs, and a term that does not improve its own Rank is either re-weighted or is not added.
4.5 The selector says the measured number
The difficulty selector shows, for each Rank: the one-line description from §4.1, the named blind spots from §4.2, and — where the services platform has enough games — its measured win rate against human players in the selecting player's own rating band.
Colonel — understands a map. Does not track victory conditions or plan around the Ebb. Wins 61% against players rated 1400–1600.
I want to defend this, because it is unusual and the commercial objection is obvious. Adjectival difficulty ("Hard") is an unfalsifiable promise, and the moment a player suspects it is inflated the whole ladder loses meaning. A number is falsifiable, and falsifiable is what makes the ladder worth climbing. It also solves the calibration-drift problem: a Rank whose measured rate moves more than 8 points between releases is a release-blocking alarm rather than a slow silent lie, which is exactly the failure VC §12 fears for its own calibration table.
The honest cost: some players will read "wins 61% against players like you" as discouraging. The mitigation is that the sentence above it names the blind spot, which reads as an invitation.
5. Weakness that reads as human
§2.1 made the argument; this section is the specification.
5.1 The three mechanisms, and nothing else
Omission. §4.2's table. Terms are absent, not corrupted. An AI without a supply term does not mis-evaluate supply, it does not evaluate supply — so it will cheerfully drive an offensive forty tiles past its Reach and be surprised when it melts, which is what happens to people.
Latency. k and C. The Aim is stale by up to k − 1 turns; an Operation persists C turns
past its trigger. A Cadet at k = 8, C = 10 is committed to a plan formed eight turns ago and will
hold it for ten turns after it stopped making sense. That single pair of integers produces
tunnel vision, sunk-cost persistence, and late reaction — three of the four things that most reliably
mark a weak player — deterministically, with no randomness anywhere.
Attention. A and S. A Cadet examines three Dispatch items and acts on none of them outside
the command layer. Things happen in the parts of its empire it is not looking at. This is not a
simulation of inattention; it is inattention, produced by a budget.
5.2 What is forbidden
Restating §2.1's list as a rule set because it is the part most likely to erode under schedule pressure:
- No random corruption of a selected order.
- No deliberate-misplay branch of any kind.
- No throttled perception. If a threat is visible and within the examined Dispatch items, every Rank sees it; Ranks differ in whether they can afford to do anything about it.
- No provably pointless action (§4.3.5).
- No behaviour a player could not express (§2.2's shared vocabulary rule).
And one that matters for the fiction: no Rank may play inconsistently with itself. If a Cadet does not evaluate supply, it must never accidentally do the supply-aware thing because a different term happened to point that way in a manner the player will read as competence. In practice this is a consequence of omission rather than an extra rule, and it is why omission is better than noise: a noisy AI is inconsistent by construction, and inconsistency is the specific thing that makes an opponent unreadable.
5.3 The one deliberate imperfection, and why it is not noise
There is a real gap in the omission model. An AI at Cadet plays a small game, but within that small game it plays flawlessly — it never mis-executes, because the command layer executes for it. That produces an odd opponent: narrow but mechanically perfect, which is not what a beginner is either.
The answer is commitment bias, already present as C, plus one addition: the Aim's chosen plan is
re-scored at re-plan time using the forecast it made k turns ago, not a fresh forecast, for
Ranks with k ≥ 3. The AI evaluates whether its plan is working against what it expected to happen,
not against what did happen. This produces the most human failure available: continuing a plan because
it is close to the projection, when the projection was wrong. It is deterministic, it costs one
stored integer vector per theatre, and it disappears at Colonel and above where k ≤ 2.
6. Personality
6.1 The vector
Fourteen dials. Every one changes something a partner document specifies; none is a mood.
| Dial | Range | Aurel | What it actually changes |
|---|---|---|---|
expansion |
0–1000 | 500 | Gate. Offensive Operations are illegal while unintegrated × 1000 > integrated × expansion (EC §8's Blitzer/Consolidator axis, made into a rule) |
cadre |
0–1000‰ | 120 | Share of Works budgeted to Administrative Cadre (EC §6) |
climb |
0–1000‰ | 180 | Share of Works budgeted to Industry upgrades (US §2.2) |
engage |
1–999‰ | 700 | The Favourable(N) written into its Doctrines (CM-590) |
prudence |
1–999‰ | 334 | The Prudent(N) value (CM-670) |
leash |
×⅓ – ×3 | ×1 | Multiplier on Posture-default Leash (CM-640) |
mass |
0–1000 | 500 | Preference for Pace Concentrated (CM-1000) and the minimum battery count it will bombard with (CB §7.2) |
opportunism |
0–1000 | 500 | Weight on Opportunity Dispatch items (CM-1370) and the Seize default it chooses |
grudge |
0–1000 | 200 | Target weight added per city a seat has taken from it |
predation |
−1000…+1000 | 0 | Positive: prefers weak targets. Negative: prefers the leader |
nerve |
0–1000 | 500 | Willingness to enter Alarm (VC §6.2) before it is airtight |
homeland |
0–1000 | 500 | Weight on retaking its own cities, where Loyalty memory restores Integration in full (EC §6.4) |
track[14] |
0–1000 each | 500 | Per-Track affinity across VC's catalogue |
P[class] |
−30…+30 | 0 | Dispatch class weights (CM-1770), fixed and non-adaptive for an AI seat |
Two of these are structurally different from the rest and that is deliberate. expansion is a
gate, not a weight: it makes whole Operations illegal, which is how you get a personality that
holds its shape under pressure instead of drifting to the optimum when the numbers get large.
predation is signed, which lets one dial produce two opposite and equally coherent opponents —
the one that finishes the wounded and the one that fights the leader.
6.2 The roster
Names are drawn from the register the design already uses in its worked examples — Meridian, Karsk and Ostry from TM §4, Vela and Corvain from EC §8 — because those examples already gave two of them characters and it would be perverse to invent new ones.
Offsets shown as absolute values; anything not listed is Aurel's.
expansion |
cadre |
climb |
engage |
prudence |
leash |
mass |
opportunism |
grudge |
predation |
nerve |
homeland |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Aurel | 500 | 120 | 180 | 700 | 334 | ×1 | 500 | 500 | 200 | 0 | 500 | 500 |
| Corvain | 900 | 60 | 100 | 600 | 200 | ×2 | 350 | 800 | 150 | +500 | 750 | 250 |
| Vela | 200 | 320 | 300 | 850 | 450 | ×½ | 700 | 250 | 400 | −100 | 300 | 900 |
| Karsk | 400 | 200 | 220 | 800 | 300 | ×½ | 900 | 300 | 700 | 0 | 400 | 600 |
| Ostry | 550 | 140 | 160 | 650 | 250 | ×3 | 200 | 900 | 250 | +700 | 600 | 300 |
| Meridian | 450 | 240 | 260 | 750 | 350 | ×1 | 750 | 400 | 300 | 0 | 250 | 500 |
| Sabar | 500 | 200 | 200 | 720 | 334 | ×1 | 550 | 450 | 100 | −900 | 350 | 500 |
Track affinities, showing only the departures from 500:
| Raised | Lowered | |
|---|---|---|
| Corvain | Dominion 900, Throne 700 | Hegemony 200, Prosperity 150 |
| Vela | Prosperity 900, Horizon 850 | Dominion 250, Every Last City 100 |
| Karsk | Hegemony 900, Dominion 600 | Ascendancy 200, Warrants 250 |
| Ostry | Warrants 900, Keys 700, Ascendancy 700 | Great Work 150, Prosperity 200 |
| Meridian | Ascendancy 950, Keys 900, Warrants 850, Horizon 700 | Every Last City 150 |
| Sabar | — (scores denial of the leader's Track, not its own) | Great Work 200 |
And the characters, which is what a player actually reads:
Aurel — the baseline. No preferences. The best play the tuning pipeline has found. Present so that "I want a good opponent, not a character" is answerable, and so that every other personality has a price.
Corvain — the Mortgage. Takes more than he can govern, and dares you to punish it. He is EC
§8's Blitzer as a person: expansion 900 and cadre 60 mean he will hold forty cities at Integration
20 and pay for it with a garrison bill and a manpower crisis. predation +500 sends him at whoever
is weakest. You will see: cities changing hands fast, revolt countdowns in his rear from about
turn 70, an army that is armour-heavy because his Manpower is starved (EC's forced 2.3:1 mix).
Counterplay: do not fight his line. Raid the Cadre column and retake your own cities, where
Loyalty memory gives you everything back the turn you walk in.
Vela — the Household. Small, dense, and impossible to kill at home. expansion 200 is a hard
gate: she will refuse profitable conquests while she has anything undigested. homeland 900 means
every city you take from her is immediately and expensively contested. She wins on Prosperity and on
the Horizon, by Tenure, which she accumulates while you are busy. You will see: never more than
two un-integrated cities; short Depot chains; instant counterattacks. Counterplay: she compounds,
so you must be ahead early and you must beat her on the clock, never in her homeland.
Karsk — the Anvil. Fights where the ground pays, and starves what he cannot storm. mass 900
means he will not bombard with fewer than three batteries and will not attack without them — CB
§7.2's equilibrium is a rule he obeys. He chooses Hills, Forest and Mountain, entrenches, and reaches
for CB §8's supply-cut result (cutting the road beats three extra battalions) rather than assaulting
the cell that resists everything. grudge 700: hurt him and he will finish that argument before
starting another. You will see: a very high Entrench rate; long sieges; roads cut behind
positions. Counterplay: do not let him pick the ground, and race him — his tempo is his weakness.
Ostry — the Rasp. Attacks the machinery, not the army. opportunism 900, leash ×3, Pace
Dispersed. His target weights are the design's soft spots: Cadre ×6, Academy city ×5, Great Work
site ×5, Depot ×4, Arsenal or Foundry ×4. He is predation +700 and will strip a collapsing player
for parts. You will see: fast units a long way behind your line, your Integration bars stopping,
a Depot chain collapsing from the middle, an Academy lost. Counterplay: escort Cadre, garrison
rear Industry, and give your Screens a real Leash.
Meridian — the Calendar. Turns up on the day, with everything. VC publishes the Tally rotation
24 turns ahead, Warrants 5 turns ahead with 15-turn deadlines, and the Ebb schedule from turn 1.
Meridian's Aim is anchored on the next scheduled event and its March routes are timed to arrive on
the day, not before. nerve 250 means it will not enter Alarm until it is airtight. You will
see: ten quiet turns, then a corps at the Lit Landmark on the exact Tally turn. Counterplay:
read the same calendar. It is public. This is the personality that teaches the victory system.
Sabar — the Balance. Fights whoever is winning, including you. predation −900. Sabar scores
an Operation by the leader's Track progress it removes, not by what it gains, and will abandon a
profitable front to hit whoever entered Alarm. It is the reason a four-player game with AI seats does
not produce a runaway. You will see: a neighbour that ignores you entirely until you lead the
Watch, and then does not ignore you. Counterplay: do not lead visibly — which makes VC's banded
visibility (§6.1) a live strategic concern, exactly as VC hopes. Honest cost: Sabar is the
personality most able to kingmake in a game with more than one human, and it is off by default in any
game with two or more human seats. §9.5 says why.
6.3 Personality is orthogonal to Rank, with a stated degradation
A Cadet Karsk and a Marshal Karsk are both meaningful: Rank is how well it executes, personality is what it wants. Six Ranks × seven personalities is 42 opponents from thirteen data files.
The complication is honest and must be surfaced: a dial that references a term the Rank does not have cannot express itself. Meridian's calendar needs the Track terms that arrive at General. Karsk's road-cutting needs the Reach terms that arrive at Colonel.
The rule: a personality dial whose feature is absent degrades to its nearest expressible proxy, and
the proxy is named on the setup card. Meridian below General cannot time an arrival to a Tally, but
its Track affinity still biases which cities it wants — Landmarks, and regional completeness — which
is observable and recognisably Meridian. Karsk below Colonel cannot cut a road but still chooses
defensible terrain and still refuses to bombard with fewer than three batteries, because mass reads
CB terms that exist at Lieutenant.
Each personality therefore declares a full-expression Rank:
| Personality | Fully expressed at | Below that, dormant |
|---|---|---|
| Corvain | Captain | nothing important; he is a Cadet-legible character |
| Vela | Captain | homeland is a target preference only |
| Karsk | Colonel | starvation Operations; supply-cut targeting |
| Ostry | Colonel | Depot-chain targeting; Cadre interdiction is Captain |
| Meridian | General | the calendar; timing; Vigil arithmetic |
| Sabar | General | leader identification degrades to "largest visible empire" |
Corvain and Vela are fully expressed at Captain, which is the default Rank, and that is not an accident — the two personalities that read most clearly to a new player are the two that need the least machinery.
6.4 The Override — personality never authorises losing
Without this rule, a personality with low nerve and low Track affinity watches an opponent complete
a Vigil and does nothing, and the player's reaction is not "what a distinctive opponent" but "that AI
is broken".
The Override. At any Seal where an opponent holds an active Vigil on a Track the AI projects to complete before the AI can complete one of its own, the AI MUST allocate no less than one quarter of its uncommitted force to the plan with the highest
denyvalue available to it, and MUST NOT allocate to any plan withdeny = 0until that quarter is committed. Personality weights are otherwise untouched.
The design is deliberate in three ways. It forces a contribution, not a conversion — Vela still digests, Corvain still eats Green, and neither becomes Sabar for a turn. It uses a quarter, which is enough to matter and not enough to lose a front. And it operates on the projection, not on the Alarm banner, so it fires slightly before the banner does for high Ranks and slightly after for low ones, which is correct: noticing early is a competence.
It is also the rule that makes VC's Vigil do the work VC wants. VC §2.2 argues that the Vigil's
asymmetry — the leader must be airtight for V turns; the challenger needs one successful attack —
is the anti-snowball mechanism. That argument is only true if the challengers actually challenge. In
a game with AI seats, the Override is what makes it true.
6.5 The preference margin
Personality expressed purely as weights has a failure mode I found while working the example in §8: two plans can score 1531 and 1529, and which one a "personality" picks is then noise wearing a character's name. A one-point margin on a 1500-point score is not a preference.
The margin. A plan is preferred over another only if it exceeds it by at least 50‰ of the leading score. Within the margin, the personality's declared tie-break list decides. Beyond that, CM-170's terminal tie-break chain applies.
Each personality declares an ordered tie-break list of at most four clauses, and this is where a lot of its character actually lives:
| Personality | Tie-break order |
|---|---|
| Aurel | lower cost; then sooner; then lower entity id |
| Corvain | more cities gained; then sooner; then lower cost |
| Vela | lower cost; then higher yield; then nearer home |
| Karsk | better ground (higher defender cover at the decisive tile); then lower cost; then sooner |
| Ostry | more targets of opportunity on the route; then sooner; then lower cost |
| Meridian | better prepared (higher combined-arms score); then closer to a scheduled date; then lower cost |
| Sabar | higher deny; then sooner; then lower cost |
Converting a fragile numeric knife-edge into a declared, legible preference is worth more than the precision it costs, and it means a personality's behaviour at the margin is stated rather than emergent — which is what makes it survive a re-tuning of the weights.
7. Legibility
Two halves: reading an opponent well enough to plan against it during the game, and understanding afterwards why it did what it did.
7.1 During play, without breaking fog
The shared vocabulary rule does most of the work for free. Because the AI has no private
movement policy (§2.2), every enemy behaviour a player observes is a behaviour they can name. A
player who watches an enemy unit shuffle sideways to keep a frontage in view is watching a Screen,
and they know it, because they have issued one. A player who watches an enemy column halt on contact
rather than attack is watching Engagement Defend. This is enormous and it is free: the entire
command vocabulary is a shared language for describing what the enemy is doing, and it exists whether
the opponent is a human or an AI.
The Dossier. A per-opponent panel built only from the observing player's own observation log. It is not a window into the AI; it is a staff summary of what this player has actually seen, and it must be available for human opponents on identical terms — if it were AI-only, players would use its presence to identify AI seats, which matters for substitution (§9).
KARSK — 41 turns observed, 63 sightings, 9 engagements witnessed · Entrenched on 7 of the last 9 turns you observed him. · Has not initiated an attack on a tile you held with 2 or more units. · 6 of 9 engagements you witnessed were in Hills, Forest or Mountain. · Artillery seen: never fewer than 3 together. · Cities taken from you: 2 (Ashford t91, Rill Ford t104).
Every line is derived from the player's own log. Nothing is revealed. And it turns two hundred turns of scattered glimpses into the thing a general's staff exists to produce, which is a pattern.
Named opponents, as an option. VC publishes Landmark locations from turn 1 on the argument that
fog exists to hide what your opponent is doing, not what the world is (VC T5). A named opponent
with a published one-line character is world, not action. So: Opponents: Named / Anonymous, Named
by default in solo and skirmish, Anonymous in Tournament. Under Named, the setup screen shows each
AI seat's personality name, its character line, and its full-expression note. Under Anonymous, you get
the Dossier and nothing else, and the Dossier is where the game gets good.
Track affinity is banded like everything else. An AI's preferred Track becomes visible through VC's existing Rumour/Report/Alarm precision (VC §6.1). No new channel and no new leak.
7.2 The Intent Record
The AI's sibling to CM-1940's CommandDecisionRecord. Emitted per AI seat per turn, carrying:
- the Aim: the chosen plan, its score, its runner-up and that score, and the terms that separated them;
- each Operation assigned, its theatre, its trigger, and its force allocation;
- the Dispatch items examined, which were acted on, and for each declined item the reason (out of budget, below margin, forbidden by a gate, deferred by commitment lock);
- every Decisive Point, with the CB predictor inputs and outputs that justified it;
- whether the Override fired, and what it forced.
Versioning follows CM's split exactly: Intent Records ride the advisory stream (CM-190, CM-2080), not the rules hash. They are re-derivable from a replay and never authoritative.
7.3 The Debrief
At game end, the player may read every AI seat's Intent Records in full. During the game they may read a redacted version limited to facts they observed — which for a well-scouted theatre is most of it, and for an unscouted one is nothing, which is correct.
The Debrief's best feature is one that only exists because §4.2 names the blind spots:
Turn 148 — Sable Reach. Your encirclement worked. Colonel evaluates supply Reach, so it saw the road being cut; it committed anyway because its projected relief force arrived on turn 149 and the pocket broke on 148. Turn 91 — Ashford. Your encirclement worked because Lieutenant does not evaluate supply Reach at all. Against Colonel that move does not work twice.
That is teaching. It names what happened, distinguishes being outplayed from exploiting a gap, and sells the next Rank honestly rather than by adjective.
The Second Opinion. Because the core is deterministic and headless and a Cascade is milliseconds, the player may, after the game, pick a past turn, change one of their own orders, and watch what the AI does in response. It must be labelled precisely — it is the AI's response to a changed world, not a claim about what would have happened, because every other seat re-derives too. Post-game and solo only; it is a study tool, not a save-scum.
8. Worked example: four personalities, one Alarm
VC's reference game (VC §7): medium map, 48 cities, 5 Landmarks, 8 regions, 4 players, Horizon 200. Tracks: Dominion (625‰, Vigil 3), Keys (3 of 5, Vigil 6), Horizon (Tenure). Red is the human. Blue is the AI seat, at Rank Colonel. Blue holds 14 cities, 2 Keys, Tenure 11,410.
Turn 131. Red takes Kestrel Bay, his third Key. Keys 3/3, Vigil 6 begins. ALARM. Under VC §6.2 every player receives the banner, the three site names, and live vision of Kestrel Bay, the Iron Gate and Sable Reach, including garrisons. Everyone sees the same thing. What they do about it is the personality.
What Blue can see. Kestrel Bay: urban, works 1, garrison of one Rifle Company (Trained, strength 100, Entrenched, dig-in 2, supply Adequate) plus three lesser units. Blue's staging port is nine tiles away and holds a Landing Ship, an Armoured Battalion (Veteran, strength 90), two Rifle Companies, three Field Batteries and a Destroyer. Blue's northern front is three units short on its Requisition and Green has six units massing against it. Blue has four cities taken between turns 120 and 128, all below Integration 25.
8.1 The candidate plans
The Aim level scores five plans. The term values are engine-computed and identical for every personality — that is the point of separating values from weights.
| Plan | deny |
advance |
hold |
yield |
cost |
tempo |
|---|---|---|---|---|---|---|
| A Descent on Kestrel Bay, assault t134, no guns | 900 | 150 | 0 | −180 | −230 | 40 |
| A′ Descent prepared: land t133, bombard t134, assault t135 | 860 | 150 | 0 | −200 | −90 | 20 |
| B Hold the North against Green | 0 | 0 | 260 | −40 | −60 | 60 |
| C Digest the four new cities | 0 | 40 | 60 | 230 | 0 | 5 |
| E Roll up Green's collapsing border | 0 | 240 | 0 | 320 | −70 | 40 |
deny is the projected reduction in the leader's best-Track progress over H = 16; advance is
Blue's own; hold is projected own-city losses avoided; yield is the EC closed-form Works and
Manpower delta; cost is the CB predictor's median own strength lost; tempo is VC §11's Tempo band
(60 this turn, 40 next, 20 within three, 5 beyond).
deny is large for A and A′ because breaking a Vigil that would otherwise end the game is not a
marginal gain — the terms are scaled so that the loss of the game dominates, which is a scaling
decision, not a personality one.
8.2 The weights, and the scores
Weights are per-mille; Aurel is 1000 everywhere.
deny |
advance |
hold |
yield |
cost |
tempo |
|
|---|---|---|---|---|---|---|
| Aurel | 1000 | 1000 | 1000 | 1000 | 1000 | 1000 |
| Sabar | 1900 | 700 | 900 | 800 | 800 | 1100 |
| Meridian | 1200 | 1400 | 900 | 900 | 1300 | 1400 |
| Corvain | 600 | 1500 | 600 | 900 | 500 | 1200 |
| Vela | 700 | 800 | 1600 | 1400 | 1500 | 900 |
Scores, Σ w × v / 1000:
| A | A′ | B | C | E | Chooses | |
|---|---|---|---|---|---|---|
| Aurel | 680 | 740 | 220 | 335 | 530 | A′ |
| Sabar | 1531 | 1529 | 220 | 271 | 412 | A (see below) |
| Meridian | 885 | 973 | 204 | 324 | 589 | A′ |
| Corvain | 536 | 540 | 162 | 309 | 661 | E |
| Vela | 189 | 325 | 324 | 454 | illegal | C |
Each term is floored independently before summing, so the totals are reproducible integers.
Three things in that table are worth stopping on.
Sabar's 1531 against 1529. Two points on a fifteen-hundred-point score is not a preference, it is
arithmetic dust — exactly the failure §6.5 exists to prevent. The margin is 50‰ of the leading score,
so ceil(1531 × 50 / 1000) = 77, and the two plans differ by 2. They are therefore indistinguishable
by score, and Sabar's declared tie-break list decides instead: higher deny, then sooner, then lower
cost. A's deny is 900 against A′'s 860, so the first clause settles it and Sabar goes immediately,
without the guns. That is Sabar's character, arrived at by a stated rule rather than by two points of
noise — and had the weights shifted by one per cent in either direction, Sabar would still go early,
which is the whole point of having the rule.
Vela's illegal E. Blue holds four un-integrated cities against roughly ten integrated. Vela's
expansion gate is 4 × 1000 > 10 × 200, which is 4000 > 2000 — true, so every offensive
Operation is illegal for her. She does not score E at all. This is what a gate buys that a weight
cannot: a personality that holds its shape when the numbers get tempting.
Vela chooses C. Digest, while Red runs a six-turn Vigil. Left alone that is a losing move, and it is precisely the case §6.4 exists for.
8.3 The Override fires
Red holds an active Vigil on Keys, and Blue's H = 16 projection says it completes at turn 137.
Blue is in no Vigil of its own. So the Override binds every personality: a quarter of uncommitted
force to the highest-deny plan, before anything with deny = 0.
| Main effort | Override allocation | Result at Kestrel Bay | |
|---|---|---|---|
| Aurel | A′ prepared descent | — (main effort already denies) | Takes it t135. Red's Vigil breaks at 4/6 |
| Sabar | A immediate descent | — | Falters t134. Re-attacks t136 with the guns it should have brought; breaks at 5/6 |
| Meridian | A′ prepared descent | — | Takes it t135, and books the t139 Tally on the way |
| Corvain | E, roll up Green | Destroyer + Corvette blockade the sea approach; raiders cut the land route | Blockade closes t135; garrison Isolated t135–136; Red withdraws it t136 rather than lose it. Breaks at 5/6 |
| Vela | C, digest | The three Field Batteries and one Rifle Company, shipped as a reduced A′ | Takes it t136. Breaks at 5/6 — one turn from losing the game |
(The Vigil counter is t − 131, so completion falls at the Seal of t137. Three of the five
personalities break it with one turn to spare, which is a good deal closer than it should be and is
the Vigil doing exactly the job VC §2.2 designed it to do.)
Corvain's line is the one I like most, because it is cheap and it is the design's own best answer. He never assaults. He applies CB §8's result — cutting the road does more than three extra battalions — and EC §7's isolation attrition, and Red has to choose between relieving a Landmark and holding a front. That is a personality that does not fight and still contests, and it exists because the Override forces a contribution and lets the personality choose its shape.
8.4 Why Sabar's turn-134 assault falters, in CB's own arithmetic
Worth working, because the whole difference between Sabar and Meridian is one turn of preparation and the numbers are the argument.
The defender, Rifle Company (atk 30, def 44, tough 100), Trained (+80 power, +5 resolve, vol 850), strength 100, disorder 0, Entrenched, dig-in 2, works 1, in a city Red now owns, supply Adequate. Foot in Urban is +200.
D_raw = floor(44 × 100 × (1000 + 80 + 200) × 1000 / 1e8) = 56
defenderMods = urban cover +500, Entrenched +300, dig-in 2 +200 = +1000
D = floor(56 × 2000 / 1000) = 112
Resolve = 40 + 5 (Trained) + 15 (Entrenched) + 6 (works 1) + 10 (own city) = 76
Sabar's attack, t134. Lead Armoured Battalion (atk 62, tough 130), Veteran (+180), strength 90, Armor in Urban −250. Two Rifle Companies in support at factor 400.
lead = floor(62 × 90 × (1000 + 180 − 250) × 1000 / 1e8) = 51
each rifle = floor(30 × 100 × (1000 + 80 + 200) × 400 / 1e8) = 15
A_raw = 51 + 15 + 15 = 81
attackerMods = Assault +250, combined arms (Armor + Foot) +120 = +370
A = floor(81 × 1370 / 1000) = 110
Odds 110 : 112, essentially even. Volatility: lead Veteran 700, defender 850, mean 775, urban chaos +350 → 1125, a swing of ±281‰. At the median draw the swing is zero:
shareA = floor(110 × 1000 / 222) = 495 shareD = 505
Ld = floor(60 × 495 × 100 / (1000 × 100)) = 29
La = floor(60 × 505 × 100 / (1000 × 130)) = 23
shockDefender = 29 + 8 × min(4, 2 flankers) + 6 assault = 51 vs resolve 76 → holds
shockAttacker = 23 + 10 entrenched + min(16, 8 × 1 works) = 41 vs resolve 37 → BREAKS
Attacker resolve is 40 + 12 (Veteran) − 10 (Assault) − floor((100−90)/2) = 37. So Sabar's
assault falters: it deals 29, takes 23, gains no ground, picks up +25 disorder and may not attack
again this turn. An even-odds attack against an entrenched defender in works is a bad attack, and CB
says so before the button is pressed.
Meridian's version. Three Field Batteries bombard on t134. One battery against D = 112:
A_bombard = floor(48 × 100 × (1000 + 80 − 100) × 1000 / 1e8) = 47
shareA = floor(47 × 1000 / 159) = 295
Ld = floor(22 × 295 × 100 / (1000 × 100)) = 6
disorder = 3 × 6 + 5 = 23
Three batteries: −18 strength, +69 disorder, against a city's −45 disorder recovery halved to −22
because the defender was engaged. Net at the Seal: strength 82, disorder 47. This is CB §7.2's
equilibrium obeyed exactly — one battery would have accomplished nothing, which is why Meridian's
mass 750 refuses to fire with fewer than three.
t135, the assault Meridian actually makes, armour plus a rifle company plus a battery in support — three roles, so combined arms is +260:
D_raw = floor(44 × 82 × 1280 × 1000 / 1e8) = 46 D = floor(46 × 2000/1000) = 92
Resolve = 76 − 47 disorder − floor((100−82)/2) = 20
A_raw = 51 (armour) + 15 (rifle) + 18 (battery) = 84
A = floor(84 × (1000 + 250 + 260) / 1000) = 126
shareA = floor(126 × 1000 / 218) = 577 shareD = 423
Ld = floor(60 × 577 × 100 / (1000 × 100)) = 34
La = floor(60 × 423 × 100 / (1000 × 130)) = 19
shockDefender = 34 + 8 × min(4, 3) + 6 = 64 vs resolve 20 → BREAKS
The garrison breaks. It is in works, so CB §8 says it cannot retreat and instead fights on at −20 resolve; Kestrel Bay falls to strength loss over that turn and the next. Meridian pays 19 instead of 23, gains the city instead of nothing, and spends one extra turn of Red's Vigil to do it.
The lesson the Debrief will print: Sabar attacked at 0.98:1 into works. Meridian removed 56 points of resolve for 18 points of damage and then attacked at 1.37:1. Neither had better odds by much. One of them understood that odds and resolve are different levers.
9. Multiplayer roles
9.1 Three levels of absence, and why conflating them is the usual mistake
Most games have one substitution state and it is too blunt. This design has three, and the first one requires no AI at all.
| State | Trigger | Who is playing | Mandate |
|---|---|---|---|
| Standing | A player did not commit this turn | Nobody. The command layer. | Whatever the player's own Postures and Sanctions already authorise (CM-2010) |
| Caretaker | 2–3 consecutive missed turns, or an explicit Away setting | An AI, restricted | §9.2 |
| Substitute | The player has left; automatic in ranked after the declared count | An AI, unrestricted, at a declared Rank and personality | Full |
Standing costs nothing and covers most cases, and this is a genuine structural advantage of the turn model. Because orders are policies evaluated at activation (TM §3.2) rather than scripts, a player who misses a turn is not absent from the board. Their Screens still spread, their Requisitions still fill, their garrisons still hold, their Reflexes still fire. CM-2010 and CM-2020 already specify it: units with no Posture take their Fallback Posture for that turn only, the stored Posture is not changed, and Dispatch items persist to the player's next session rather than being consumed. In correspondence play, where a missed turn is a missed day, this is the difference between a mode that works and a mode that does not.
9.2 The Caretaker mandate
A Caretaker exists to stop a seat decaying while its player is briefly gone, and its design constraint is the one that makes it acceptable to everyone else at the table: a Caretaker must be unable to lose your game for you, and equally unable to win it.
| May | May not |
|---|---|
| Keep production running; fill Requisitions; re-post reinforcements | Change any Doctrine, Requisition target, or Posting weight |
| Respond defensively to threats: reposition Screens, relieve a threatened city, entrench | Initiate an offensive Operation of any kind |
Take a city the seat's own Seize Sanctions already authorise |
Change a Seize Sanction, or take a defended city |
| Repair, rotate worn units, resupply | Disband a unit, abandon a Garrison, raze a city |
| Move Cadre along already-planned routes | Re-site a Great Work, or start a new one |
| Abstain in a Verdict (VC §8.3) | Vote in a Verdict; concede; capitulate voluntarily |
| — | Enter a Vigil it is not already in |
The last row is the sharpest and the most important. Entering a Vigil is a commitment that hands every other player vision of your holdings for as long as it lasts (VC §6.2). No absent player's game should acquire that on their behalf.
VC's open question 10 asks how the Verdict works in async, where a vote may take days. The answer falls out of this table: Caretakers abstain, abstention counts as play on, so a Verdict in async requires present players. That is the correct outcome and it is also, honestly, a weakening of the Verdict in exactly the mode where long games hurt most. The concrete mitigation I would offer VC: a Verdict vote's window is one full turn-deadline rather than "at their next turn start", and a seat in Substitute (not Caretaker) votes by the policy in §9.6.
9.3 What makes a Substitute acceptable to the other humans
Four things, and none of them is about the AI's strength.
1. It was declared before the game started. The substitution policy — trigger count, Rank, personality, mandate — is part of the game's Terms at setup, in VC's generated-prose style, visible to everyone:
A player who misses three consecutive turns is replaced by a Caretaker. A player who leaves is replaced by Aurel at Colonel, which inherits their Postings and Doctrines for 5 turns.
Nobody discovers on turn 90 that the empire next door has become something else.
2. Its strength is pegged to a declared constant, not to an estimate. The seductive option is to estimate the departed player's strength from their play and match it. I am rejecting it. You cannot estimate a player's strength from forty turns of a fog game with any reliability — the variance is enormous, position confounds everything, and an estimator that is wrong is worse in both directions: too strong and the substitution punishes the departed player's neighbours; too weak and it hands someone a free win. Fixed declared Rank, default Captain, which is the median and is stated in the Terms.
3. The continuity window. For the first 5 turns the Substitute inherits and does not replace: it keeps the seat's Postings, Doctrines, Requisition rows and Formation structure and issues orders within them, and only afterwards begins re-planning at its own Aim level. Neighbours' plans are not invalidated overnight, and the transition is gradual rather than a discontinuity in the middle of someone else's operation.
4. Its personality is Aurel by default. A Substitute with predation or grudge kingmakes by
preference: Ostry would strip the weakest neighbour, Sabar would attack the leader, and either
outcome redistributes a game the departed player did not agree to redistribute. A neutral substitute
cannot be fair — nothing can — but it can at least be unmotivated.
And what a Substitute receives: that seat's fog-filtered view and its order history. Never the human's chat, map annotations, notes, or anything the seat itself did not observe.
9.4 Reclamation
A player who returns reclaims the seat (TM §3.5). Two additions:
- They receive the Intent Records the AI produced for the turns it ran, which is the same artifact as the Debrief and is exactly what you want on returning: here is what your empire was doing and why. This is a better handover than most human co-op games manage.
- Nothing the Caretaker did needs unwinding, because the mandate forbade anything irreversible. A Substitute's actions may well need unwinding, and that is the honest cost of having actually left.
9.5 Kingmaking, stated rather than solved
In a game with three or more seats, any AI seat's preferences redistribute the game. This cannot be eliminated, and I am not going to pretend the Override or the Aurel default solves it. What can be done:
- Sabar is off by default in any game with two or more human seats, and the setup screen says why: an opponent that deliberately attacks whoever leads is a coalition-forming rule in a game the direction brief says has no diplomacy. In solo play it is a feature — it is the thing that stops a runaway and keeps the middle third of a game live. Between humans it is a thumb on the scale.
predationis clamped to ±300 for AI seats in games with two or more human seats. The dial still produces character; it stops producing a policy of always eating the same person.- The Terms paragraph names every AI seat's personality, so a coalition-shaped AI is at least a known coalition-shaped AI, and the human players can plan around it. VC's own answer to kingmaking on capitulation is the same: make the beneficiary a stated rule rather than a surprise.
9.6 AI seats are always declared
An AI seat is never concealed. Not in setup, not in the Watch, not in the player list. I want to argue this rather than assert it, because concealment is genuinely tempting — "you don't know which of the six are people" is an interesting game.
It is the wrong trade for three reasons. It requires the AI to fake human behaviour it does not have, starting with commit timing: TM §3.6 makes presence (who has committed, how long remains) visible ephemeral data, and an AI seat that commits in 40 ms every single turn is identifiable within three turns unless we add artificial latency, which is a lie with a code path in it. It corrupts the terms of the contest, which every other document in this set treats as the thing that must be public — VC publishes the Ebb schedule and the Landmark locations on exactly this principle. And it makes the Debrief impossible to offer, because the Debrief's existence would reveal the seat.
What may be concealed is which personality an AI seat is running, under the Opponents: Anonymous option (§7.1). That is precisely VC's Sealed Orders shape — existence public, content
hidden — and it is the version of the idea that survives scrutiny.
9.7 Solo and two-player play
01-decision-turn-model.md amendment 1 is binding and it is the common case: in solo and two-player
games the Cascade must be able to run instantly with optional step-through, and the Orders phase has
no deadline unless one is asked for. The consequence for AI seats is that the AI's wall-clock budget
in solo play is not the turn gap — it is the Cascade playback, which the player is watching anyway
and which TM §3.8 already opens for rolling planning. §11 relies on this heavily and it is the single
biggest reason the compute story is comfortable.
10. Handicaps
10.1 Why labelling matters, stated at the level it deserves
The shallow reason is fairness. The real reason is epistemic: a player who beats a handicapped AI and does not know it has been lied to about their own skill, and the game has spent their time teaching them something false. Everything else in this design is built to make the player's model of the world correct — CB's exact preview, CM's decision records, VC's published Ebb schedule, EC's visible Integration bars. A hidden AI bonus is the same sin as EC §1's "invisible production tax", committed against the player's model of themselves rather than of the economy.
Two further reasons, both practical. An undisclosed advantage is indistinguishable from a bug, so every unexplained AI success becomes a support ticket. And in any game with more than one human, an undisclosed handicap is a rigged contest.
So: every handicap is disclosed at setup, in the Terms paragraph, in the in-game rules review, and in the replay header. Both directions — a handicap may favour the AI or the human — and it applies to human seats identically.
10.2 What is offered
| Handicap | Range | Why it is legitimate |
|---|---|---|
| Extra starting cities | ±3 | Visible, positional, and reasonable-about from turn 1 |
| Starting Industry | Tier 1–3 | US §2.3 already offers a per-player Industry cap as "a real, legible handicap ladder that costs no extra content" |
| Industry cap | Tier 1–4 | Same, from the other end. A veteran capped at Workshop against a newcomer at Arsenal |
| Opening stock | ±400 Works, ±200 Manpower, once | A finite, spendable, visible head start |
| Cadre discount | 50–200‰ of the escalating cost | Dials the anti-snowball brake directly and visibly (EC §6) |
| Start position quality | seeded, labelled | Map generation already ranks starts; saying so is free |
| Foreknowledge | terrain and city locations revealed at turn 0; no units | See §10.4 |
Opening stock rather than a production rate multiplier, deliberately. A rate multiplier distorts
every derived number in EC — the 25-to-35-turn payback window, the Cadre curve's N ∝ sqrt(spend)
shape, the Works-to-Manpower ratio that determines the forced army mix — so a handicapped game is
quietly playing different economics, and none of EC's worked reasoning holds. A one-time stock is a
head start that leaves the economy's arithmetic intact and can be understood as "they started with an
army", which is a sentence.
10.3 What is not offered, and one that is offered only under a condition
Not offered: production-rate multipliers, movement bonuses, vision bonuses, or upkeep discounts on one seat only. All of them are invisible in play and all of them corrupt a derived system.
Combat odds modifiers are offered only inside the predictor. This is the sharpest case and it is
worth stating why. CB §9.1 establishes that the pre-attack preview is exact, not sampled — the loss
bands come from evaluating the exchange at r = 0, 500, 999 and the break probability from a binary
search over the draw, verified against a brute-force oracle with zero mismatches — and CB §13 puts
"the actual outcome must lie inside the displayed band" in CI as an assertion rather than a
playtest metric. A hidden combat handicap breaks that invariant. It makes the preview lie, and it
turns a CI gate into a false alarm.
So if a combat handicap exists at all, it is a force modifier like any other, visible to the predictor, and enumerated in the preview's line items exactly as CB §9.3 requires of every contribution:
force +25% assault +12% combined arms +15% handicap (Marshal)
Honest, checkable, and it keeps the invariant. And because it appears in the panel every single time, nobody forgets it is on.
10.4 Omniscience is not a difficulty option
The earlier AI draft offered a labelled AI Full Vision cheat. I am removing it, and not on fairness
grounds — it was labelled, which answers fairness.
It is removed because it destroys the opponent. An AI that knows where everything is does not scout, does not screen, does not misjudge, does not lose a unit to something it could not see, and never plans against a contact that turns out to be stale. Every behaviour that makes an opponent readable (§7.1) comes from it operating under the same uncertainty you do. An omniscient AI is not a harder version of the same opponent; it is a different and much less interesting one, and it violates the shared vocabulary rule outright — no player can express march confidently through fog to the exact tile where the thing you cannot see is standing.
Foreknowledge replaces it: the AI begins with terrain and city locations revealed, and no unit information ever. That is a legible head start equivalent to very good early scouting, it does not change how the AI behaves once contact is made, and a player can look at it and understand exactly what it means. It is also, incidentally, the handicap most players actually wanted when they asked for full vision — they wanted an opponent that does not waste twenty turns exploring.
11. Feasibility, honestly
This is the section the brief demanded be rigorous, and it contains one conclusion that constrains everything above.
11.1 You cannot search this game. You can forecast it.
The numbers:
| Operation | Cost | Source |
|---|---|---|
| One exact combat preview | 0.45 µs | CB §9.2, measured |
| One combat resolution | 0.016 µs | CB §9.2, measured |
| Command-layer evaluation, 400 units, one Cascade | ≤ 50 ms, excluding pathfinding | CM-2100 |
| Dispatch ranking, 200 live events | ≤ 16 ms | CM-2130 |
| Economy tick for one city for one turn | integer, closed form | EC §12 |
| Track progress and the Ebb for one turn | integer, closed form | VC §2.4 |
The conclusion falls straight out. A full-Cascade rollout costs 50–80 ms. A client turn budget of a few hundred milliseconds therefore affords single-digit rollouts. Any architecture premised on thousands of simulated futures — MCTS over Cascades, deep minimax, rollout-heavy planning — is not available, and a document that promised one would be lying.
What is cheap is the thing this game happens to need most:
- The economy is exactly forecastable in closed form. Integration, Unrest, Levy, effective Works, the Yard, Reach, and the Cadre cost curve are all integer recurrences over a per-city state (EC §12 says so explicitly and says no fixed-point is needed anywhere). Projecting forty cities sixteen turns forward is a few hundred microseconds, not a simulation.
- Victory is exactly forecastable. VC §2.4 makes the Ebb a closed form from the turn index, Tenure a floor-divided sum, and the elimination bound (VC §8.2) exact arithmetic. VC §2.1 promises that adding a Track gives the AI evaluator its progress function for free, and this document takes that promise up.
- Combat is exactly predictable. Not estimated: CB's preview is the exact count of favourable draws in per-mille, and it is the same function the player sees, which means — CB §9.2's own words — there is no separate AI combat estimator to keep in sync and no class of bug where the AI plays a different game from the player.
So the AI's strength comes from evaluation and forecasting, not from tree depth. That is a limitation and it is also, for this particular game, a good fit: most of what separates a strong player from a weak one here is economic and positional judgement over a 16-to-24 turn horizon, and that horizon is computable rather than searchable.
The rollouts that remain are spent on verification, not exploration. At Marshal, R = 4 means: run
the chosen plan forward one Cascade against the two most likely opponent responses and against the
worst plausible one, and if it fails, take the runner-up. Four rollouts a turn, spent checking, not
looking.
11.2 A turn budget that adds up
Rank Colonel (B = 512, R = 1, P = 6), on the reference desktop, 40 cities, 150 units:
| Stage | Work | Cost |
|---|---|---|
| Knowledge update | fold ~200 sightings, age observations, update per-seat ledgers | 2 ms |
| Threat and Reach projection | bounded flood fill, incremental per EC §12's dirty-flag rule | 8 ms |
| Economy forecast, once | 40 cities × 16 turns, integer | < 1 ms |
| Track forecast, once | 3 Tracks × 4 seats × 16 turns, closed form | < 1 ms |
| Aim scoring | 512 plans × ~30 µs (deltas against the shared forecast) | 15 ms |
| Operation geometry | 4 theatres; reuses CM's ≤ 256-candidate bounded sets | 12 ms |
| Decisive Points | 12 Dispatch items × ≤ 400 previews × 0.45 µs | 3 ms |
| Verification rollout | 1 × full Cascade | 60 ms |
| Production and Requisitions | incremental shortfalls (CM-2120) | 1 ms |
| Order emission and validation | ~40 order changes | 2 ms |
| Total | ≈ 105 ms |
The trick that makes B = 512 affordable is in the table and is worth naming: forecast once, apply
deltas per plan. The shared 16-turn economy and Track projection is computed a single time; each
candidate plan is scored as a delta against it. Recomputing the forecast per plan would be 512 × 640
integer steps and would dominate everything.
Marshal (B = 4096, R = 4) comes to roughly 420 ms on the same reference. Three AI seats is
1.3 s. Against a Cascade playback of thirty to sixty seconds that the player is watching anyway (TM
§3.8), this is invisible. On a phone at roughly four times slower it is 1.7 s per seat, 5 s for three
— still comfortably inside the playback, and comfortably outside it only if the player skips the
animation, in which case a brief "resolving" state is acceptable.
11.3 The budget is not an input
This is a hard rule and it is the one most likely to be violated by a well-meaning optimisation.
The AI's decision procedure MUST be a total function of (view, configuration, Rank). No anytime behaviour, no iterative deepening cut off by elapsed time, no "spend the remaining milliseconds". A Rank's work is a fixed count of scored plans, rollouts and Points, declared in the Rank table. A slow device takes longer; it does not play worse.
The reasons are the same ones CM-110 and CM-120 give for the command layer, and one more. If the budget were an input, a farm-tuned AI would play differently on a client, the self-play results would not transfer, and a replay computed on one machine could diverge from the same replay on another — which is exactly the desync class TM §3.7 says is the most likely and the most important to catch early. It also means an AI is never silently downgraded on a weak device: if a Rank cannot meet the platform's turn-time target, that Rank is disclosed as slow on that platform rather than quietly becoming a different opponent.
11.4 AI seats do not break replays, and this is a large practical win
The AI is a client, not part of the core. Its orders enter the authoritative order log like any player's (CM-2040 forbids any other path into the simulation). Therefore:
- A replay replays the logged orders and never re-runs the AI. Changing the AI does not invalidate a single saved game.
- Contrast CM-2050 and CM-2070, where changing how a Screen picks its tile is a balance change that breaks replay compatibility, because the command layer is core. That asymmetry is worth stating loudly to whoever schedules the work: command-layer changes are expensive and rare; AI changes are cheap and continuous. The AI can improve every release for the life of the product.
- The requirement this creates: an AI seat is executed by exactly one authority per game, and its version and weight version are pinned in the game configuration. Two clients computing the same AI seat independently is a desync waiting for a version skew.
11.5 What the self-play farm actually costs
Honest arithmetic, because VC depends on this pipeline for its length-estimate table and its linter thresholds and warns that "if regenerating it is not automated, the estimates will silently become lies."
A 200-turn, 4-seat game, at the same reference:
| Rank calibrated | AI cost per seat-turn | Game cost | 2,000 games | On 64 cores |
|---|---|---|---|---|
Captain (B=128, R=0) |
~5 ms | ~14 s | 7.8 CPU-hours | ~7 minutes |
Colonel (B=512, R=1) |
~105 ms | ~94 s | 52 CPU-hours | ~50 minutes |
Marshal (B=4096, R=4) |
~420 ms | ~346 s | 192 CPU-hours | ~3 hours |
Three consequences, all of which someone needs to plan around:
- Calibration runs at Captain, not at Marshal. VC's
median_turns[track][map_class][players]table should be generated at the median Rank because that is what most games are played at and because it is 25 times cheaper. But it must then carry a Rank column, because a Marshal game is a materially shorter game than a Captain game and a length estimate that ignores that is one of the lies VC is worried about. This is a concrete addition to VC's contract. - The full sweep is a nightly job, not a per-commit gate. Twenty cells at Colonel is roughly a day of a 64-core machine. A per-commit gate runs a much smaller smoke suite; the full regeneration runs nightly and blocks a release, not a merge.
- Marshal is expensive to tune, which is part of why it is the last thing to arrive.
11.6 What I will and will not promise
| Rank | Confidence | Basis |
|---|---|---|
| Cadet → Captain | High | Hand-authored evaluation over the terms in §4.2, plus the command layer doing the unit-level work. The hard part is already specified and tested by CM's own acceptance criteria. |
| Colonel | High | Same, plus supply and encirclement terms. All the inputs are closed-form or exactly predictable. |
| General | Medium-high | Requires self-play-tuned weights over ~100 parameters and a correct Track projection. The projection is easy; the weights need the farm to work. |
| Marshal | Not promised at launch. | See below. |
The honest statement about Marshal. No shipped strategy game has an AI that reliably beats strong human players at a fog-of-war 4X without material advantages. The systems that have beaten strong humans at anything comparable had either perfect information (chess, Go) or enormous inference budgets and years of training (StarCraft), and none of them ran in a browser tab on a phone.
What this design has that those attempts at 4X AI did not: a command abstraction that collapses the action space by orders of magnitude (§3.2), a deterministic headless core that makes self-play a compute problem, an exact combat predictor rather than a sampled one, closed-form economic and victory forecasting, and event-sourced games that are training data by construction.
What it still does not have: a demonstrated method for long-horizon planning under fog at a client budget. The three candidate paths, with my honest odds:
- (a) Hand-authored evaluation, weights tuned by self-play (CEM or SPSA over ~100 integer weights). Gets to General. Probably does not get to Marshal, because the ceiling of a hand-authored feature set is the designer's own understanding.
- (b) Learned evaluation over the same feature vector — a small quantised network replacing the
weighted sum. Determinism is achievable and not a hand-wave: int8/int16 inference is bit-exact and
the codebase already demands integer arithmetic everywhere (CM-120, EC §12). Cost is affordable: a
three-layer network over ~200 features is tens of microseconds, so
B = 512is ~25 ms. This is the most likely route to a real improvement and it does not require a human corpus. - (c) A learned policy over Operations, behaviour-cloned from strong human games and refined by self-play. This is the plausible route to Marshal and it is what the event-sourced corpus exists for. It requires a large corpus of strong human games, which does not exist on launch day and cannot be manufactured.
So Marshal is defined as a measured Rank, not an aspiration. It appears in the selector when, and only when, it has demonstrated a stated win rate against human players in the top rating band on the services platform. Until then the selector shows five Ranks and a line saying a sixth is being measured. We should not ship a difficulty called beats strong humans until it has beaten strong humans, and §4.5's measured-number selector is what makes that promise checkable rather than rhetorical.
12. Why this beats the classic approach
- Difficulty is competence, and the competence is enumerated. Six Ranks, each defined by the evaluation terms it has and the terms it lacks, every one of them naming a real mechanic in a partner document. The classic slider is a resource multiplier with an adjective on it.
- Weakness is believable because it is produced the way human weakness is produced — by a smaller model and a slower re-plan, never by noise. The classic Easy setting is a competent AI with a stutter, and players see through it in one game.
- Every Rank inherits the command layer's floor, so the worst opponent in the game still garrisons its cities, keeps its production running, and never strands a transport. There is no Rank at which the AI looks broken.
- Personality is priced and published. Seven characters, each an offset from a tuned baseline, each with a measured Elo cost capped at 60. The classic personality system ships labels whose behavioural difference nobody has measured, including the people who shipped it.
- Personality is enforced by gates as well as weights, so it holds its shape under pressure: Vela
refuses a profitable conquest because her
expansiongate makes it illegal, not because a weight happened to come out small this turn. - Personality cannot lose the game. The Override forces every character to contest a Vigil it can see completing, which is also what makes VC's central anti-snowball claim true in games with AI seats.
- The opponent is readable, because it has no private vocabulary. Everything it does is a Posture, a Sanction, a Formation or an Operation, all of which the player also uses — so watching an enemy is reading a language you already speak.
- The Dossier makes reading it a first-class feature, built only from what the player observed, and available identically for human opponents so that its presence never identifies an AI seat.
- The Debrief tells you why you won, and distinguishes being outplayed from exploiting a named blind spot. No classic AI can do this because no classic AI has a stated plan to report.
- Absence is handled in three levels rather than one, and the cheapest level — a player who simply missed a turn — needs no AI at all, because orders are policies. Correspondence play gets this for free.
- Handicaps are disclosed, and the two that corrupt derived systems are refused outright: no rate multipliers, because they invalidate EC's own arithmetic; no omniscience, because it destroys the opponent's readability and breaks the shared vocabulary rule.
- The difficulty selector states a measured number. That is falsifiable, and falsifiable is the only kind of difficulty claim worth making.
13. Tradeoffs and honest costs
The ladder's low end may be stronger than intended. Cadet plays purely through the command layer,
and the command layer is good — CM-460's Screen spreads correctly, CM-660's Risk preserves units,
CM-1190's scheduler keeps reinforcements flowing. A Cadet may be a harder first opponent than a
beginner wants. The dial if so is not to break it but to give Cadet worse Sanctions: a higher
engage threshold so it rarely fights, a tighter Leash so it rarely arrives. That is still
competence-shaped weakness, but it is a second mechanism I have not specified and would rather not
need.
Six Ranks and seven personalities is 42 combinations and a real test matrix. The mitigation is that personality is data and Rank is data and neither forks code, but 42 combinations × the map and preset suite is a large nightly farm bill, and the tier-monotonicity gate (≥1000 games per step) is only defined for Aurel. Personalities are gated on the Elo-price measurement instead, which is a weaker guarantee, and I am not certain it is enough.
Personality erodes under tuning unless it is protected, and protecting it makes it go stale. The rule in §2.3 freezes personality dials and tunes only the baseline. But when the baseline moves, every personality's offset now points somewhere slightly different, and after four or five promotions Karsk may be a character nobody designed. Re-measuring the price catches the magnitude of the drift and not its direction. I do not have a good answer beyond periodic hand review.
Omission-based weakness makes some Ranks feel identical. Captain and Colonel differ by supply and encirclement terms, which are enormously important to a strong player and nearly invisible to a casual one. There is a real risk that the middle of the ladder feels like one opponent with a different number attached. The measured-selector helps (the numbers will differ even when the feel does not) but it does not fix it.
A fog-honest AI that guesses right looks like cheating. This is the complaint the design will get most, and it is unfalsifiable from the player's side during a game. The Debrief answers it after the fact — the Intent Record shows what the AI knew — but "read the debrief" is a poor reply to "it knew where my transport was". CM-130 accepted this cost for automation and it is the same cost here.
The Dossier is a lot of interface for a feature some players will never open. It is also the only answer to Problem C, and a game where reading your opponent is impossible is a game where the fog is doing more harm than good. I would build it and measure whether it is opened.
Publishing measured win rates is commercially risky. "Wins 61% against players like you" is an honest sentence and a discouraging one. It also makes every balance change visible as a number moving, which will produce arguments. I think the honesty is worth it and I acknowledge that is a judgement call rather than a derivation.
The Override is a rule that overrides the player's chosen opponent. Someone who selected Vela because they wanted a passive neighbour will, once per game, get a Vela who ships three batteries across a strait. That is correct — it prevents a broken-looking loss — but it is a designer overruling a player's selection, and the setup card must say so.
Three levels of absence is three code paths and three sets of edge cases, in a subsystem that by definition runs when nobody is watching. The mandate table is a specification of forbidden actions, which is the hardest kind to test, and a Caretaker that quietly does something it should not is exactly the class of bug that surfaces as a furious support ticket from someone who came back after a week.
14. What could go wrong, and how playtesting would show it
Every row is a measurable quantity with a target, so a regression is a failing number rather than a feeling.
| Risk | Metric | Target | If it fails |
|---|---|---|---|
| Personality is cosmetic | Identifiability: a classifier over observable-only behaviour from the first 60 turns must name the personality | ≥ 70% at Colonel | This is the headline metric. If a human's staff cannot tell Karsk from Vela from what they saw, the roster is decoration and the dials are too small |
| Personality costs too much | Elo price of each personality vs Aurel at the same Rank, ≥1000 games | ≤ 60 Elo | Re-tune or retire. A personality above the cap is a handicap wearing a name |
| Personality costs nothing | Same measurement | ≥ 10 Elo | A price near zero means the dials are not reaching the decisions. Widen the gates, not the weights |
| Ladder not monotone | Win rate of Rank n vs Rank n−1, ≥1000 games per step | ≥ 60% each step | The newly added term is mis-weighted. A/B it at its own Rank before touching the ladder |
| Weakness reads as broken | Rate of floor violations (§4.3) per 1000 unit-turns | 0 | Any non-zero value is a release blocker, not a tuning issue |
| Weakness reads as robotic | Blind panel: 20 anonymised AI turn summaries against 20 human ones from the matching rating band, "human or AI?" | ≤ 65% correct at Colonel and above | Qualitative and unavoidable. If raters are at 90%, latency and commitment bias are not producing what §5 claims |
| Ranks feel identical | Player survey after a Captain and a Colonel game: "was your opponent noticeably better?" | ≥ 70% yes | Middle of the ladder needs a differentiating mechanism beyond omission |
| Difficulty claim is a lie | Measured Rank win rate vs human rating bands, per release | drift < 8 points between releases | The selector is publishing a stale number, which is worse than publishing none |
| Legibility fails | Mid-game, show the player the Dossier and ask "what is this opponent trying to do?" | ≥ 70% correct by turn 80 | Not automatable and the most important test in the table. VC has the same test for the Watch and for the same reason |
| Debrief not read | Share of completed solo games where the Debrief is opened | ≥ 40% | If nobody reads it, the teaching claim is unsupported and the feature is expensive |
| Override too blunt | Share of games where the Override redirected ≥ 50% of a personality's force for ≥ 5 turns | < 10% | The quarter-of-force constant is too high, or the projection fires too eagerly |
| Override too weak | Share of games where an AI seat lost to a Vigil it never contested | < 3% | Raise the quarter, or fire on the Alarm rather than the projection |
| Substitution feels unfair | Post-game survey in games where a Substitute ran: "did the substitution change the outcome unfairly?" | < 15% | Lengthen the continuity window, or lower the default Rank |
| Caretaker overreaches | Audit: any Caretaker action outside the §9.2 mandate | 0 | Release blocker |
| Kingmaking | In 3+ seat games, correlation between AI seat personality and final placings of human seats | indistinguishable from zero for Aurel | If Aurel kingmakes, the neutral baseline is not neutral and the substitution default is wrong |
| AI turn cost | p95 AI seat turn time on the reference desktop and the reference phone, per Rank | inside the Cascade playback | If a Rank exceeds it, disclose the Rank as slow on that platform. Never silently reduce its work |
| Budget leaking into decisions | Bit-identical order logs for the same game replayed on desktop, phone, and farm | exact | Any mismatch is a §11.3 violation and a release blocker. This is a gate, not a metric |
| Farm calibration goes stale | Age of the newest calibration run against the newest balance change | < 7 days | VC's own warning. Automate the nightly, or the length estimates become lies |
The two I would watch first are identifiability and floor violations. Identifiability is the only metric that directly measures whether the whole personality thesis is true. Floor violations are the only ones that can make the game look broken to someone who has played it for an hour.
15. Open questions I could not settle
Is a zero-budget Cadet too strong? The command layer is good enough that an AI which merely sets sensible Postures may be a harder first opponent than a beginner should meet. I would rather discover this in playtest than pre-emptively cripple it, but the fix (worse Sanctions rather than fewer overrides) is a second weakness mechanism and I do not love having two.
Do Captain and Colonel feel different to a player who does not understand supply? The terms that separate them are the ones a strong player values most and a casual player notices least. If the middle of the ladder is flat, something other than omission has to differentiate it, and I do not know what.
Should personalities be named by default? §7.1 decides Named in solo and Anonymous in Tournament, on VC's "fog hides what your opponent is doing, not what the world is" principle. The counter-argument is decent: an unnamed opponent that you deduce is Karsk is a better experience than one that was labelled Karsk in setup, and the Dossier is what makes the deduction possible.
Is Sabar a good addition to a multiplayer game or a rigged one? §9.5 turns it off by default above one human seat and clamps
predation. In solo it is clearly good — it is the thing that stops a runaway and keeps the middle third live. Between humans I genuinely do not know, and it interacts with VC's own unresolved question about Contested Warrants, which is the same argument.Can a fog-honest AI ever stop looking like a cheat? The Debrief answers it after the game. Nothing answers it during. I suspect the real answer is a short in-game explanation attached to any AI action that surprised the player — "it did not see your transport; it was screening that ford already" — but that is an information channel and it needs a fog review I have not done.
What is the right preference margin
M? 50‰ is a guess. Too small and personality is noise; too large and everything is decided by the tie-break list, which makes the weights decorative. Measurable: the share of Aim decisions resolved by tie-break rather than by score should sit somewhere around a fifth, and I have no evidence for that number either.The Override's quarter. One quarter of uncommitted force is a guess with no derivation. It is also the constant that decides whether a personality survives contact with a leader, so it wants the counterfactual-replay treatment VC §13 uses: re-run each game with the Override disabled and measure how many AI seats lose to an uncontested Vigil.
Does personality survive repeated tuning? §2.3's freeze protects the offsets but not their meaning. After several baseline promotions the characters may drift into things nobody designed, and the Elo price measures the size of the drift but not its direction. Periodic hand review is not a system.
Is the measured-strength selector right? It is honest and it may be discouraging. It is also irreversible as a commitment: publishing a number and then withdrawing it reads as an admission.
Should a Substitute's Rank track the game's other AI seats rather than a fixed default? In a game already containing a General, replacing a departed human with a Captain changes the balance of the table. Matching the other AI seats is more consistent and less predictable; a fixed declared constant is more honest. I chose honest and I am not sure.
What does an AI seat do about Sealed Orders (VC T12)? It must not act as though it knows another seat's hidden objective. Inferring one from unexplained behaviour is legitimate and is exactly what Marshal's opponent model is for — but the line between "inferred from observed behaviour" and "read the game state" is one bad import away, and it needs an explicit test rather than an assurance.
16. Contracts — what this angle needs from other documents
Recorded so that a change on either side is detectable.
| From | What is needed |
|---|---|
| 10-turn-model (TM) | Rolling planning (TM §3.8) opened for AI seats specifically, so an AI turn may be computed during the previous Cascade's playback — §11.2's whole budget argument rests on it. The three-band initiative display of TM's open question 2 must be available to an AI seat on the same terms as to a player, and no finer. The presence/commit signal must not carry anything beyond the declared AI label. |
| 11-combat (CB) | The exact per-mille predictor with its estimated flag (already promised via CM-2150), and the pivot analysis of CB §10 — "they break unless they are Veteran or better" is the decision-relevant fact, and an AI that only gets the 0–1000‰ band under fog is strictly worse than a player who is shown the pivot. Any handicap touching combat must be a force modifier visible to the predictor and enumerated in the preview (§10.3). |
| 12-economy (EC) | The closed-form projections this document forecasts against, exposed as pure functions over a hypothetical state: effective Works, Levy, Integration and Unrest ticks, the Cadre cost curve, Reach propagation and supply grade. EC's Order Board exception list (§5) as a machine-readable stream, since it is the economic half of the AI's attention budget. |
| 13-command (CM) | The Attention Event stream readable by an AI seat for its own position (CM-1610 already emits it deterministically per player). CM-1770's P for an AI seat is personality data recorded in the game configuration, not adaptive client state, and CM-1780 does not apply to it. Confirmation that every command object is submittable as an ordinary order, which CM-2040 already gives. |
| 14-victory (VC) | Track progress and threshold functions evaluable at hypothetical states, which VC §2.1 already promises the AI evaluator. The Ebb closed form, the Tally rotation and the Warrant schedule as forward-readable data. The deterministic Verdict vote policy VC's contract asks this document for is supplied in §9.2 and below. The calibration table needs a Rank column (§11.5). |
| 02-units-and-industry (US) | Capability flags rather than unit identities, so the AI plays custom rosters without hard-coded knowledge. The per-player Industry cap as a handicap lever (§10.2). |
| Architecture / services | The headless self-play farm at the scale in §11.5; an Elo ladder over human games to feed §4.5's measured selector; the nightly regeneration gate; and the AI version + weight version pinned in the game configuration and the replay header (§11.4). |
| 04-ui-ux | The difficulty selector's measured-number layout (§4.5), the personality setup cards including the full-expression note (§6.3) and the Override warning (§13), the Dossier (§7.1), the Debrief and the Second Opinion (§7.3), and the Terms-paragraph disclosure of substitution policy and every active handicap (§9.3, §10.1). |
The Verdict vote policy, supplied. At a Verdict offer (VC §8.3) an AI seat votes to end the game if and only if all three hold, evaluated from that seat's own view using only the public Standing and banded Track information VC §6.1 already publishes:
- For every enabled Track, its projected best progress at the Horizon — computed at its Rank's
H, using VC §8.2's own ceiling arithmetic — is below the leader's current progress by more than the maximum it can still gain; and - its Standing has not increased in the last 8 turns; and
- it holds no city it projects it could convert into a Vigil within 20 turns.
Otherwise it abstains, which VC counts as play on. A Caretaker always abstains. The policy is deterministic, uses no information the seat does not have, and is deliberately conservative — it plays on unless the arithmetic says it cannot win, which is what VC §8.3 wants when it says a beaten AI should concede when it should and the single-player mop-up should largely disappear.