The flow
- The prompt.
> ENTER TARGETwith a blinking block; Photon geocodes the place from OpenStreetMap and the atlas descends on it as before. - The grid. One exposure worker reads the population within 2, 5, 10, 20 and 30 km of the target from GHSL 2025 (the R2 bucket at
tiles.grid84.app). - Identification. The geocoder's tags first: a military tag is counterforce and hard; an airfield, a port, a power plant, an industrial site or a seat of government is a point target. Otherwise the density profile: annuli above 800 people per km² out from the centre give the urban radius, and a place with an urban radius of five kilometres or 300,000 within ten is urban-industrial, countervalue; a town is struck as one area; anything less as a point. (Land-use grids would refine this; HYDE's are on disk and not yet prepared.)
- The adversary. A stated rule by country: NATO and its neighbours to Russia; Russia and China to the United States; Japan and Korea to North Korea; India to Pakistan west of the Siliguri corridor and China east of it; Pakistan to India; Iran and Israel's declared enemies to Israel; Taiwan, Guam and the Pacific to China; anywhere else to the nearest arsenal that reaches it, which the console calls a fallback. The reader can overrule it with the nine buttons.
- The delivery. Every launch point of that power in
data/atlas/forces-2025.json(bases public, patrol areas guessed, loads and yields of the opaque arsenals inferred, Israel's withheld) is tried; aircraft and cruise options are set aside while a missile reaches; each remaining option's load is scored by the fraction of the urban area it would put under 5 psi (a heavy missile's full load, or two loads of a lighter one, never more than twelve), and the shortest flight among the best-covering wins. So Warsaw and Paris draw a Voevoda's ten warheads from Dombarovsky, Moscow and Beijing eight Trident warheads from a boat, Aberdeen four from a Yars, Tokyo two Hwasong-18s, Delhi two Shaheens, Tehran two Jerichos; a point target takes the shortest flight. The options and their coverage are printed. - The weapon, sized for effect. An urban area: the 5 psi radius of one warhead at the chosen burst against the urban radius gives the discs needed to tile it, up to a ceiling of 48; aim points fall in a sunflower spaced so the discs meet, and the engine's MIRV grouping puts them on buses. A point target: as many warheads on its one aim point as the kill probability needs to reach a damage expectancy of 0.9, given the system's CEP and reliability against the target's hardness, up to the load; a bunker under a poor CEP draws several. Where the missiles exceed one site's salvo of four, the strike calls on the next sites of the same system nearest first, and the nearer launches are held so every warhead arrives together: time on target. Options are scored accordingly, an area by the coverage the system's sites in range can put up together, a point by the damage expectancy one load achieves. Loads per missile are the deployed averages the Notebook gives, not the missiles' capacities.
- The wind. Open-Meteo's forecast at 850, 700 and 500 hPa over the twelve hours after the strike, vector-averaged into one effective wind, with the circular spread of the directions read as shear; the surface wind is printed beside it. A westerly at fifteen miles an hour with the table's 15° shear if the service is not reached, and the console says which. The plume model widens and shortens its contours for the shear (by the square root of the ratio to 15°, a stated rule), scales the dose rates by Glasstone's 0.7 for a real surface, and its contours fade outward with their H+1 dose rate, so the far 1 rad per hour tail reads faintly.
- The countdown from ten, with hold, vector now, and stand down.
- The prelude. The study opens on the target, close, for ninety study seconds: the aim points materialise one by one with a flash and a label carrying their offset from the centre and the weapon's CEP, each ringed at its CEP; the log names the laydown rule, the first aim points, the kill probability and the approach. Then the launch pulls the camera out to the whole flight.
- Kill probability. The target's category sets the overpressure it fails at (a city at 5 psi, industry and ports at 15, an airfield at 25, command at 50, infrastructure at 100, a military site at 1,000); the lethality lab's SSPK = 1 − 0.5^((r/CEP)²) with the system's CEP, times its planning reliability, gives the chance per warhead as fired and the expected aim points killed. Against a city with a megaton-class warhead the single-shot figure is effectively one and reliability is what remains; against a hardened site the CEP is the whole story. CEPs and reliabilities are in the forces file, documented for the American and Russian strategic systems and inferred for the rest.
- The boost phase. Each ballistic option flies the class profile for its range and propellant: burnout at three minutes for a solid, five for a liquid heavy, tens to hundreds of kilometres up and downrange, then the coast. The console prints where and when burnout comes and how long a boost-phase interceptor would have, detection within the first minute deducted; the log marks burnout, the trail carries an amber point at it, and the bus releases ninety seconds later. This is the arithmetic behind the difficulty of boost-phase defence: a few minutes over the adversary's own territory.
- The study. Surface burst by default so the plume is drawn, with the console saying doctrine would airburst a city and the readout can show it; further reading links to the 72 minutes, the fallout and accuracy labs, the chronicle and the sources.
Standoff air delivery
The bombers and the submarine cruise systems in the forces file carry a standoff: the missile's own range, not the aircraft's radius, since doctrine is to release at the edge of it and outside the defences. Each is the published figure with its tier and its note, printed on the console as a STANDOFF line and on the launch point's readout:
| System | Standoff | Tier | Note |
|---|---|---|---|
| B-52H with AGM-86B | 2,500 km | documented | The ALCM's range; the B-52 has not been expected to penetrate since the 1980s |
| Tu-160 and Tu-95MS with Kh-102 | 4,000 km | inferred | The nuclear Kh-101 is reported from 2,500 to 4,500 km |
| H-6N with CJ-20A | 2,000 km | inferred | Reported 1,500 to 2,000 km |
| Rafale with ASMPA-R | 500 km | documented | About 500 km at Mach 3 |
| MiG-31K with Kh-47M2 Kinzhal | 500 km | inferred | The claimed 2,000 km includes the aircraft's radius; the missile is an air-launched Iskander, and its nuclear option is asserted rather than shown |
| Dolphin with Popeye Turbo | 1,500 km | withheld | Reported and never confirmed |
| B-2A with B61-12 | none | A guided gravity bomb: the aircraft must reach the target through whatever defends it, and the console says so |
The engine flies the aircraft along the great circle to the release point, turns it for home, and sends each missile on from there to its own aim point at its own speed; a boat with a standoff at its range fires from where it sits, and an aircraft whose target is nearer than its missile's reach flies only a 150 km climb-out. Aircraft from one base fan three kilometres apart into a flight. The whole-missile focus treats a released load as it treats a bus, marking the release. Where it matters: places within a bomber's reach but outside a missile's; the theatre air legs; and, by choice, the classic air leg against any target.
Reading the ground
Identification used to have two inputs: the tag OpenStreetMap puts on the point the geocoder returned, and the population density around it. Both are thin. A tag describes a point and not the square kilometre around it, and density cannot tell a refinery from a housing estate.
So the console now asks Overpass for the land-use polygons within two and a half kilometres and measures their areas by the shoelace formula. The result is what a targeteer actually wants: how much of this ground is industrial, how much is housing, whether there is an aerodrome or a barracks on it, and what the largest named thing on it is called.
The case that shows why it matters is Fairford, in Gloucestershire. OpenStreetMap calls it place=village and three thousand people live there, so the old classifier called it RURAL and struck it as a point for want of anything better. The ground says forty-eight per cent farmland, twenty-four per cent green, twenty per cent military, five square kilometres of it, and the largest polygon within two and a half kilometres is named RAF Fairford. It is now classified MILITARY, hard, surface burst.
The order is: the tag first, because a tag that says military=naval_base is a statement about this place rather than an inference from its surroundings; then the ground; then the density, as before. The readout says which of the three decided.
Overpass is a live service, it is slow and it fails. Nothing waits on it: the request runs alongside the population read and the wind, with a nine second timeout, and when it does not answer the console prints GROUND NOT READ and falls back to the tag and the grid.
The HYDE land-use grids this engine already carries cannot do this job. They are agricultural — cropland, grazing, pasture, rangeland and rice — with no built-up class at all, which is right for a harvest and useless for a target. They are used for the harvest, in #/winter.
Honesty
The adversary and the weapon are a heuristic and are printed as one, line by line, with the rule that produced each. Nothing here is a plan on record. The forces file is one entry per system and place, not a count; the file says so. No attrition, no defence, no warning.
Files
src/atlas/forces.ts, adversary.ts, solver.ts (classify, deliveryOptions, sizeWeapon, planStrike), profile.ts, wind.ts, strike-study.ts, StrikeConsole.tsx; scripts/build-forces-2025.py; tests in solver.test.ts and strike-study.test.ts. StudyView gained autoplay and studies gained links.