In the Mountains — are the proportions of the soldiers, the outpost, the villages, the terrain, and the distances between them true to the real Korengal?
2026-06-06 · seed korengal · measured on HEAD · model numbers from the live game, real-world numbers from a cited 13-agent research pass
The short answer: your instinct is right — and the loudest problem is the easiest to fix.
At the default zoom the game paints each soldier ≈21 m wide on the ground — 36× too big — so men visually dominate a 170 m outpost and a squad standing at textbook spacing fuses into a single blob. That is a rendering bug, not a simulation bug. Strip it away and the underlying sim is, in most dimensions, already authentic: the elevation, the 1,368 m of relief, the ridge-crest heights, the engagement ranges, the 9-man squad, even the 5.5 m man-to-man spacing all check out against doctrine and the real valley.
The deeper geometry drifts — the map is one short, square slice of a long narrow slot; a "village" is drawn as one building instead of a hamlet of ~90; the garrison is a touch under-strength — are real, but they are contained, deliberate design choices. Two buckets, and Bucket 1 is cheap.
Every dimension we could pin to a number, ranked by how far it is from reality. The two giant bars are a render bug and a render+sim bug; below them a short cascade of genuine geometry drifts; and a reassuring cluster of green — things that are already right.
BUCKET 1 — Representation (render only, do first). The sim's numbers are mostly correct; the renderer misreports them. Low-risk, high-impact, fixes ~90% of the "feels wrong." Touches only lib/render/ + components/world/.
BUCKET 2 — Simulation scale (worldgen, do second). Genuine model choices about valley size, village structure, roster, and standoff. Higher blast radius; each is a realism-vs-playability call and must respect the determinism contract.
How scale works here (60-second primer)
The world is a 512 × 512 grid at 5 m per cell — a 2.56 km square (lib/sim/terrain.ts:118). The camera carries a single scalar, ppm — pixels per metre — that defaults to 0.7 (WorldView.tsx:103) and ranges 0.3–8.0. The pipeline is honest by construction: the pure simulation works in metres; the renderers multiply metres by ppm to get pixels. A building's footprint in metres × ppm = its size on screen. That is faithful.
Soldiers are the exception. A man is not drawn from his footprint. He is drawn at figurePx = clamp(ppm × 7, 15, 40) (lib/render/draw.ts:19) — a fixed pixel size with a 15 px floor, divorced from his real 0.6 m width. Divide that by ppm and you recover how many metres of ground the game is implicitly claiming the man covers. That single line is the source of the headline problem.
Finding 1 — Soldiers are painted as giants RENDER · highest impact
Because figurePx has a pixel floor, the more you zoom out the larger the soldier becomes relative to the ground. At the default zoom he is 21.4 m across; he is never smaller than 5 m at any zoom the game allows. A real soldier is 0.6 m.
The same story in hard numbers, straight from the live renderer's own formulas (the ◄ default row is what you see on load):
zoom (ppm)
figure px
ground width
vs real 0.6 m
% of COP width
9-man squad
screen covers
0.3
15
50 m
83× oversized
29.4%
blob
4800 × 3000 m
0.5
15
30 m
50× oversized
17.6%
blob
2880 × 1800 m
0.7 ◄ default
15
21.4 m
36× oversized
12.6%
blob
2057 × 1286 m
1
15
15 m
25× oversized
8.8%
blob
1440 × 900 m
2
15
7.5 m
13× oversized
4.4%
blob
720 × 450 m
4
28
7 m
12× oversized
4.1%
blob
360 × 225 m
8
40
5 m
8× oversized
2.9%
blob
180 × 113 m
At the default zoom a single soldier spans 12.6% of the entire outpost's width. A real soldier spans 0.35% — a 36× exaggeration. (Even the low-zoom NATO dot, the r = clamp(0.95·ppm, 4.5, 13) marker at draw.ts:96, is ~13 m wide at default — a ~21× exaggeration on its own.) Here it is on the live map, with a trustworthy 100 m scale bar:
The COP at the default zoom (ppm 0.7). The garrison reads as a chunky cluster of figures piled on the outpost — each figure is drawn ~21 m wide. Scale bar = 100 m.
Why it exists, and why the fix isn't "1:1." Drawing a man at his true 0.6 m would make him a sub-pixel speck at operational zoom — invisible. The renderer over-corrects with a fixed floor. The right answer is the standard operational-wargame convention (NATO APP-6 / MIL-STD-2525; Command Ops, Combat Mission, Steel Beasts all do this): one small unit icon per element when zoomed out, individual figures at near-true footprint when zoomed in. The codebase already has the instinct — it hides the garrison entirely below ppm 0.5 (WorldView.tsx:342); fix R2 just generalizes that all-or-nothing cull into a per-squad icon. See R1 and R2 in the change brief.
Finding 2 — A squad at correct spacing renders as one blob RENDER
This is the subtle one, and it explains why the spacing feels wrong even though the sim spaces men correctly. The simulation disperses a moving squad at 5.5 m between men (range 4–12 m, formation.ts) — squarely inside the doctrinal 1–10 m wedge band (FM/ATP 3-21.8: "normally 10 metres," tightening in close terrain). But at the default zoom, 5.5 m on screen is only 3.85 px, while each figure is drawn 15 px wide. The figures are four times wider than the gap between them, so they overlap at every zoom the game offers — the spacing you set can never be seen.
A 9-man squad placed at the model's real 5.5 m spacing, default zoom. Nine men — but you see a clump. Scale bar = 100 m.
Same squad at tactical zoom (ppm 2.0). The outpost is at left; the squad on the apron is still an unresolved cluster. Scale bar = 50 m.
The squadFiguresOverlap column in the table above is blob at every single zoom level. Fix this with the same R1/R2 changes — once a man is drawn near his true size and a squad collapses to one icon when zoomed out, real dispersion becomes visible.
Finding 3 — A "village" is one building, not a hamlet RENDER + SIM · biggest geometry error
The research is unambiguous (confidence 0.75): a real Korengal village — Babiyal, Aliabad, Loy Kalay — is a cluster of ~80–100 mud-and-stone houses stacked on hillside terraces, housing 650–830 people. The game models a village as a single walled compound: WorldView.tsx:198 draws exactly one qalat sprite (widthM 24/36/50 m by population) over a single map pin. A whole settlement is rendered as one box.
The COP (left) and the nearest village (right) in one frame at ppm 1.6, with a soldier placed beside the compound. The 'village' is a lone structure — not the dozens of stacked houses a real hamlet holds. Scale bar = 50 m.
A single Afghan family qalat at 20–60 m per side is itself plausible (the model's 40–80 m compound sits at the upper end of that) — the error is that one compound stands in for the entire village. Fix R3 scatters a population-scaled cluster of sub-compounds for a render-only win; a deeper Bucket-2 version stamps real multi-compound footprints into the terrain.
Finding 4 — The valley is one short, square slice of a long, narrow slot SIM
The real Korengal runs ~9.7 km along its axis and is only ~0.5–1.0 km wide on the floor — roughly a 10:1 slot (confidence 0.92 on length, 0.85 on width; Wikipedia campaign article + FDD + cross-checks). The game's map is a 2.56 km square: about 3.8× too short along-axis and ~3.4× too wide for the floor, and a square simply cannot hold the real long-narrow geometry.
The most honest framing is that the map represents one ~2.56 km segment of the valley, not the whole thing — which is a defensible tactical-slice choice. Two smaller notes: the floor's elevation gradient runs the wrong way (the real Korengal drains north into the Pech, so the low end should be north, not south), and the 5 m cell resolution is actually finer than public 30 m DEMs — appropriate for a tactical sim.
Finding 5 — The garrison is a satellite OP, and slightly under-strength ORG + SIM
The 35-man platoon maps cleanly onto a forward observation post (Restrepo held ~15 men at a time, a platoon-affiliated ~30–35) — not the company-HQ Korengal Outpost, which held ~100–150 men across the valley. That is "right echelon, wrong node," and entirely defensible: you command a platoon, so a platoon-sized post is the correct scope.
Two concrete drifts worth fixing:
Weapons squad: 3 vs 9. The model's weapons squad is one-third the doctrinal size, which is the entire reason the platoon totals 35 instead of the real 39 organic / 42 with attachments (FM/ATP 3-21.8, confidence 0.9). A pure roster fix.
COP shape: a clean 170 m circle. The footprint scale (~250 m overall) is right (Wanat's VPB Kahler was 300 × 100 m), but a real small OP was a ~30-HESCO fishhook, ~70–100 m of wall, conforming to the terrace — not a tidy ring (~220 m of wall / ~90 HESCOs). The model has roughly 2.6× too much wall and the wrong, too-regular geometry.
What is already authentic (leave it alone)
A realism audit that only lists faults is crying wolf. These dimensions check out against doctrine and the real valley — changing them would make the sim less true:
Vertical scale & relief✓ measured 1,531–2,899 m, 1,368 m of relief — real floor-to-crest is ~1,000–1,650 m. The mountains are the right size.
Ridge crest heights✓ model 2,330–2,780 m vs real Abas Ghar 2,378 m / Sawtalo Sar 2,854 m.
Valley-floor elevation✓ model 1,550 m ≈ the DEM-measured KOP terrace (~1,500 m). (The encyclopedic "1,000–1,200 m" describes the lower valley near the Pech mouth.)
Engagement ranges✓ model 30–620 m vs the real bimodal 16–800 m (~50% of fights past 300 m — Ehrhart, CGSC). Only the 620–800 m tail is clipped.
Rifle squad size✓ 9 men, exact.
Man-to-man dispersion✓ 5.5 m default (4–12 m range) sits inside the 1–10 m doctrinal wedge band. The value is right; only the rendering hides it.
COP siting✓ on a terraced bench 12–95 m above the floor — better-sited than the cautionary real outposts (Keating, Wanat) that sat on the valley floor and conceded the high ground.
How this was verified did an AI really do this?
Nothing here is a guess; every number is either read from the running game or sourced to a citation.
Model numbers — measured, not recalled. A headless Chrome-DevTools harness booted the live game (seed korengal), read the world geometry from window.__ITM, then applied the renderer's exact clamp formulas to compute the ground-metres-per-figure at each zoom. That is the projection table above; the raw capture is in scale-measurements.json.
Real-world ground truth — a cited research pass. 13 agents in parallel: five researchers (valley geography, US outposts, villages/qalats, infantry doctrine, cartographic convention), an adversarial verification of seven load-bearing numbers, and a synthesis. ~849K tokens. Anchored to FM/ATP 3-21.8, Sebastian Junger's War, MAJ Ehrhart's CGSC monograph on Afghanistan engagement ranges, PeakVisor geodata, and SRTM/Copernicus DEM cross-checks for the KOP↔Restrepo distance. Full record in research-raw.txt.
Adversarial check on the central claim. A separate skeptic re-read the renderer to try to refute "soldiers are drawn grossly oversized with no per-squad aggregation," quoting the code.
Honest confidence & caveats. The strongest findings (valley length, ridge heights, doctrinal org/dispersion, engagement ranges, the render math) are multiply-sourced or directly measured. The softest are the valley floor elevation (encyclopedic figures conflict with the DEM; reconciled as lower-valley vs mid-valley) and the per-village footprint & house counts (derived from population arithmetic, not measured). A few primary PDFs (the CSI Wanat study, RAND, Wesley Morgan's The Hardest Place) returned 403 or snippet-only. The direction and order of magnitude of every finding are robust; the exact per-village figures are estimates.
The fix, in priority order
The full, agent-ready brief — doctrinal basis → exact file:line → concrete parameter values → integration seam → verification metric, for each change — is in AGENT-BRIEF.md beside this report. In short:
R1 · Stop drawing 5–50 m soldiers. Replace figurePx = clamp(ppm·7, 15, 40) with a footprint-tracking size and a small legibility floor; push the figure-LOD band to genuinely tactical zoom. render
R2 · One icon per squad when zoomed out. Below ~ppm 2.5, draw a single NATO unit symbol per squadId at the squad centroid instead of 35 stacked men; crossfade to individual figures above it. render
R3 · Villages as clusters. Scatter a population-scaled ring of sub-compounds per village instead of one monolithic qalat. render
Bucket 2 · Sim geometry. Restore the 9-man weapons squad (→ 39–42 platoon); reshape the COP from a circle to a terrain-conforming, shorter-walled position; and treat the map explicitly as one segment of a 10:1 valley (or stretch the long axis). All with determinism preserved (serialize()/loadWorld(), smoke.ts). sim
Doing R1 + R2 alone — a few lines in draw.ts plus one squad-aggregation pass in the WorldView render loop — resolves the soldier-giant and squad-blob problems that drive almost all of the "doesn't feel true to life," at near-zero risk to the simulation.
Sources
FM / ATP 3-21.8, Infantry Rifle Platoon and Squad — squad/platoon org, movement formations & intervals ("normally 10 metres").
Sebastian Junger, War (and the documentary Restrepo) — KOP as company HQ, Restrepo manning, Babiyal ~½ mile south, HESCO "fishhook."
MAJ Thomas P. Ehrhart, Increasing Small Arms Lethality in Afghanistan: Taking Back the Infantry Half-Kilometer (US Army CGSC, 2009) — ~50% of engagements past 300 m.
Wikipedia, Korangal Valley campaign & Korangal Valley; FDD Long War Journal — valley length/width, village count, OP network.
PeakVisor — Sawtalo Sar 2,854 m, Abbas Ghar 2,378 m (geodata); SRTM / Copernicus DEM — KOP↔Restrepo distance & vertical separation.
Battle of Wanat references (VPB Kahler 300 × 100 m); MDPI Buildings (2025) on qala dimensions.
Live game measurement: scale-measurements.json; full research record: research-raw.txt.
Generated for In the Mountains · all model figures measured on HEAD at seed korengal · diagrams and screenshots reviewed and revised before publication.