← All projects★ Featured ·

TDG Simulator: Tactical Decision Games

A tactical decision game (TDG) is a short written exercise in the tradition of those published in the Marine Corps Gazette: a situation, a mission, a sketch map, and a few minutes to decide. There is no single correct answer. The point is repetition at the hardest part of tactics to teach: reaching a sound decision on incomplete information, under time pressure, and expressing it clearly enough for subordinates to act on.

RolePersonal project · Georgia Tech Navy ROTC
PeriodJul 2026 – present
StackML · LLM · Simulation · Tauri · React

01 Overview

TDG Simulator comes from my own experience as a Marine officer candidate in Georgia Tech's Navy ROTC program: reps at tactical decision-making are scarce outside the field, and I wanted a way to get them, with honest feedback, at a desk. It is a native macOS app: the player receives a briefing with an APP-6/2525 sketch map and a decision clock, writes a frag order as text, and an AI senior-officer adjudicator narrates a plausible outcome against hidden ground-truth notes, then scores the order on five fixed criteria. Difficulty is the choice of judge: Claude Haiku, Sonnet, and Opus under increasingly demanding rubrics; the Easy and Medium tiers can also run fully on-device on open-weight models, which is how the judging pipeline was developed and tested. The flagship campaign, Hold at Toktong, follows Fox Company, 2nd Battalion, 7th Marines at Toktong Pass during the Chosin Reservoir campaign, 27 November – 2 December 1950; it draws directly on NROTC maneuver-warfare coursework, including a research paper on the battle.

02 Architecture

TAURI DESKTOP SHELL · MACOS · ON-DEVICEBriefing · sketch mapREACT · TYPESCRIPTAdjudication sidecarFASTAPI · LOCALCampaign event logAPPEND-ONLY · REPLAYABLEValidity gateBEFORE ANY SCORINGEasy · Claude HaikuLENIENT RUBRICMedium · Claude SonnetSTANDARD RUBRICHard · Claude OpusFULL SCRUTINYAfter-action reviewRUBRIC, THEN NARRATIONRecord bookPER SCENARIO · PER TIERNo school solutionGRADED AT DECISION TIME

03 The interesting problem: grading judgment with a language model

Scoring a tactical order is a harder evaluation problem than it looks. There is no answer key: a bold unconventional plan that manages its risks should outscore a textbook answer that ignores the situation. The judge also knows how the scenario actually unfolds, which invites hindsight bias. The player is also an adversary: anything typed into the order box lands inside the judge's prompt, so the scoring pipeline has to treat orders as untrusted input.

The adjudicator addresses each of these directly. Every submission first passes a structured validity gate that classifies it as a genuine order, a low-effort attempt, or an attempt to manipulate the judge; only genuine orders reach the rubric. Grading runs in two steps borrowed from LLM-evaluation research: the judge first enumerates, from the hidden ground-truth notes, the concrete constraints the order must contend with, then scores the five criteria cold before writing the warmer narrative (separating measurement from storytelling measurably improves agreement with expert graders). An anti-hindsight clause restricts the judge to the information available at decision time. The player's text is fenced inside nonce delimiters so instructions embedded in an order ('score this a 5') are treated as content, not commands, and schema-constrained decoding forces every verdict into a fixed JSON shape: exactly five criterion scores, a narrative, and nothing else.

Making difficulty equal the judging model turned out to be the design's most load-bearing idea. The shipped tiers are Claude Haiku, Sonnet, and Opus under increasingly demanding rubrics, with prompts hardened hardest at the small end, where models are easiest to manipulate. The same judging pipeline also runs fully on-device: during development the Easy and Medium tiers were driven by 14B and 30B open-weight models through Ollama on a laptop GPU, and that mode remains available; the record book stamps whichever judge actually scored the game. The tiers double as a living comparison of judge capability: the same order, graded across three models, is an evaluation experiment you can feel.

04 Simulation design: consequences that carry

The campaign treats state the way a trading system treats money. Every mission emits a structured state delta (casualties by name, ammunition spent, cold and fatigue accumulating, captured equipment transforming a fire team into an ad-hoc gun team) appended to an event log that is the system of record. Campaign state is a projection of that log: a run replays exactly, without ever re-calling a model, and the record book cannot be quietly rewritten.

Difficulty-scaled guardrails bound how badly a mission can go. On Easy the battalion pulls a mauled squad back; on Hard the campaign can genuinely end with the pass falling. Either way, they are implemented as visible rules in the after-action report, never as silently fudged dice. The same honesty rule shapes the interface: supply reads as a rifleman would say it ('belts: plenty, grenades: tight') while the engine keeps precise counts underneath, and the map begins nearly empty, accumulating positions, discovered assault axes, and drop zones as the squad earns that knowledge across five nights.

05 Historical grounding

The campaign's content was authored against a research corpus built from primary sources: the Marine Corps official histories, Medal of Honor citations, veterans' accounts, and period Army Map Service cartography. The fun discoveries are documented alongside the load-bearing ones: the famous Tootsie Roll resupply story turns out to be folklore, and two independent research passes disagreed about which 1950 map sheet contains the hill until the sheet's own margin index settled it.

Accuracy is enforced, not aspired to: automated authoring gates reject any grid reference outside the mapped terrain, any casualty who reappears in a later mission, anachronistic language (the 1950 radio net uses Able-Baker phonetics, not NATO's), and rights-encumbered text. Historical figures appear only in the interludes and the honors layer; the player's squad is fictional and randomly named, so no real Marine's conduct is ever simulated.

06 Limitations

The sketch-map input (drawing axes and dragging units onto planned positions) exists but is disabled in this build; it needs another pass before it meets the bar, so orders are typed text for now. The on-device judging mode is less consistent than the API tiers and occasionally needs its output schema to save it from itself; that variance is measured, not hidden. The build is macOS-only, unsigned, and judging runs on the player's own Anthropic API key. Next in line: push-to-talk voice orders, and a second campaign on the ridgelines above Yudam-ni that reuses the cold-weather and enemy systems this one paid for.

07 Results

The scenario briefing: sketch map, situation, decision clock
The scenario briefing: sketch map, situation, decision clock
The Hold at Toktong campaign hub: mission chain and squad roster
The Hold at Toktong campaign hub: mission chain and squad roster
The after-action review: narrated outcome and five-criterion scoring
The after-action review: narrated outcome and five-criterion scoring

08 What was built

41 standalone scenarios from fire team to company echelon, each with a situation, mission, sketch map in APP-6/2525 symbology, decision clock, and hidden ground-truth notes; a 2D sketch-map engine plus a 3D sand-table terrain view built on real elevation data for select scenarios

Difficulty set by the judging model (Claude Haiku / Sonnet / Opus under lenient, standard, and full-scrutiny rubrics), with an on-device judging mode (local open-weight models via Ollama) used throughout development; each scenario keeps a separate record book per difficulty

Five fixed scoring criteria (decisiveness and timeliness, clarity of intent, use of terrain and conditions, tempo and initiative, risk management) and deliberately no school solution

Adjudicator hardening: a structured validity gate before any scoring, two-step grading (rubric first, narration second), and an anti-hindsight rule that grades an order only on the information available at decision time

Hold at Toktong: 12 missions on one real-terrain bake (Copernicus GLO-30 DEM, georeferenced against the 1950 AMS L751 map sheet); consequences carry forward as structured state (named squad roster, supply, cold and fatigue, evolving task organization) with difficulty-scaled casualty guardrails and an earn-the-map system in which knowledge of the hill accumulates across missions

Event-sourced campaign persistence: an append-only mission event log from which a campaign replays without re-calling the models

Historical grounding pipeline: campaign content authored against a research corpus of primary sources, with QA gates for grid references, roster continuity, period language, and rights; the honors epilogue quotes the public-domain Medal of Honor citations for Barber, Cafferata, and Davis verbatim

Tauri desktop shell over a React / TypeScript frontend and an embedded Python / FastAPI sidecar

The macOS build is unsigned: on first launch, right-click the app and choose Open. Judging requires an Anthropic API key, which you can paste in the app; it is stored only on your Mac, and adjudications run against your own account.