War Atlas · Method series · Paper 02
A registered study that could not be run, published as a documented absence rather than withdrawn
Abstract. This study was registered to compare, across four named cities, the weight of bombs and shells delivered onto each against how much harder each then proved to take. It is refused. Neither variable exists. A sweep of 189 database tables, 74 workbook sheets and 170 battle records — 78,065 text units in all, with positive controls passing 3 of 3 — returned no figure for ordnance delivered onto any of the four places; every string resembling one resolves to a different quantity, usually supply carried into a place rather than munitions dropped onto it. The outcome side is worse: defensibility has no operational definition, no column and no scale anywhere in the corpus, and two of the four cases have no database record at all. Of the 24 case-by-quantity cells the study needed, 2 hold a usable value. The refusal is published rather than shelved because the claim is already circulating inside this corpus at a middling confidence tier on three rows that look like three witnesses and are one. This is a class 2 registration, so it would have made no claim about cities in general even had it run; it makes none now.
In late August 1942 the German air force bombed Stalingrad heavily, and the city was afterwards very hard to take. A claim built on that sequence is one of the most repeated in all military writing: that the bombing did not soften the city but fortified it, because a field of broken masonry gives a defender better cover, better concealment and worse tank going than the intact buildings did. The same story is told about Monte Cassino, where an abbey was destroyed from the air and the ruins were then held; and, more quietly, about Caen and Ortona.
The claim is worth measuring because it is strategically load-bearing and almost never stated in a form anyone can check. It proposes that an input can pass a threshold beyond which more of it produces less — which, if true, is a rule about attacking cities and not an anecdote about one of them.
Before any data appears, the strongest argument against it. Rubble is not a defender's asset alone. It also breaks up the attacker's problem into small independent fights, and it did the same to the defender's command: a force fighting in a ruin loses the street plan, the telephone line and the ability to see its own flanks, exactly as its opponent does. This corpus has already ruled on that point against itself. Its register of rejected general claims records, at entry 3, that "terrain always favours the defender" failed as too coarse, on the express ground that "the same rubble that protected Chuikov's men also fragmented German command." The rubble is therefore already on the record here as cutting both ways, and nothing in this corpus can separate the two directions.
This paper does not settle that argument. It reports that the argument cannot be settled from anything on this machine, and states precisely what is missing so that someone else can go and get it.
Among the cases admitted by the rule in §3, a city subjected to heavier ordnance before or during an assault proved harder to take than one subjected to less.
Class 2. The measure class records how far a finding is entitled to reach: class 1 describes a corpus, class 2 compares named cases and reaches no further, class 3 claims something about a population and needs a written rule for admitting members to it. This registration is determinate at class 2 — four named cases, no claim about cities in general — and the class was never the obstacle. A class 3 successor is not merely unwritten; it is unreachable, because a population claim would need the same two variables this paper reports as absent.
The rule has a gate and a test, and the gate runs first.
Gate. The study proceeds only if, for at least three of the four admitted cases, both an ordnance quantity and an outcome quantity exist with a stated basis — a written statement of what the number counts and how it was arrived at. If fewer than three cases carry both, the study is refused and the absence is published instead.
Test (reached only if the gate opens). The claim stands as description if the case with the heaviest ordnance shows the highest defensibility value and the case with the lightest shows the lowest, with no single case reversing the ordering. It fails if the ordering is unrelated to ordnance, or inverted.
Ordnance would be ratio scale — a quantity with a true zero, on which arithmetic is meaningful. Defensibility, under any of the four operational definitions considered in §3, would also be ratio. City identity is nominal: a label, on which no arithmetic is permitted. The one graded column that does exist, cover_value in the building typology, is ordinal — an ordered set of words, poor through excellent, whose steps are not equal and cannot be averaged, summed or correlated. No arithmetic is performed on it anywhere in this paper, and §6 records the risk that a later worker will forget that.
A defect in the ordering must be declared here rather than buried. The corpus sweep and the class determination were carried out in a grounding pass before the decision rule above was written down. The rule is therefore not preregistered in the strict sense, and it is treated as a threat to validity in §6.2 rather than glossed. Its outcome is not sensitive to the ordering, because the gate turns on whether a variable exists at all — a condition with no threshold anyone could have tuned after seeing the data.
The rule was written to be applied, and it is applied below. A case is admitted if it satisfies all six criteria.
Applied. Criterion 1 admits all four candidates. Criterion 2 admits two: Stalingrad and Monte Cassino have rows in the atlas battle table; Caen and Ortona have none. Criterion 3 admits none. Criteria 4, 5 and 6 are therefore never reached, and no case is admitted. The gate in §2 closes at zero of a required three.
How the set was found, in plain words. Not by rule. The four cases were named in the method series' own queue, where they appear as the four famous rubble battles, and they entered this study on that basis. Two of them were named before anyone checked whether they exist as data. That is a selection effect of the plainest kind and it is recorded again in §6.1.
Table 1 is the complete inventory of what the sweep returned. It is not a table of the study's variables, because the study has none; it is a table of everything on this machine that a reader might reasonably expect to serve as one, with the reason each cannot. Every row carries two required columns.
Basis states what the quantity counts and how it was arrived at, because the same word covers different quantities: tonnage carried in is not tonnage dropped on, and a rate per gun per day is not a total. Confidence takes one of four values, defined here and used consistently:
unverified. Better than T0 in that it is addressable; not yet checked against anything.| Item | What it says | Quantity and unit | Basis | Confidence | Address |
|---|---|---|---|---|---|
| 1 · Rubble field | "the paradox: bombing improves the defence"; behaves as "cannot be destroyed further" | none; cover_value "excellent" (ordinal) |
A cell in a 12-row typology of building kinds. Ordinal grade over the typology, not a measurement of any city. No join object connects the typology to any battle or place. Typical setting given as "Stalingrad after August 1942". | T0 scaffold | material-layer.xlsx [building_types] r12 |
| 2 · Cellar | "below the depression limit of a tank gun"; "Stalingrad's decisive layer" | none; cover_value "excellent" (ordinal) |
Same typology, same absent join. A statement about a building kind, not a count of cellars in any city. | T0 scaffold | material-layer.xlsx [building_types] r9 |
| 3 · Grain elevator | "near-immune to field artillery"; "height plus concrete plus interior galleries" | none; cover_value "excellent" (ordinal) |
Same typology. Names one structure type at Stalingrad; carries no count, no ordnance figure and no outcome. | T0 scaffold | material-layer.xlsx [building_types] r11 |
| 4 · Reinforced concrete | "the best urban cover; rubble stays in blocks" | none; cover_value "excellent" (ordinal) |
Same typology. Five of its twelve rows are graded plainly "excellent" and two more carry qualified variants of it, so the grade barely discriminates within the typology, let alone between cities. | T0 scaffold | material-layer.xlsx [building_types] r6 |
| 5 · Mechanism M‑RUBBLE | "Rubble defends better than intact buildings"; note: "the bombing meant to break the city built the terrain that held it" | none | Unattributed assertion. The table holding it has five columns — id, mechanism, inverts, why, note — and neither a source field nor a confidence field, so no provenance can be attached to it without altering the schema. | none recordable | atlas.db stal_mechanism M-RUBBLE |
| 6 · Fragment density | Metal fragments recovered per unit area at one hill | 1,250 fragments per m² |
Density recovered from Mamayev Kurgan soil, dated post-war. A measurement of the ground, not of the battle — the row's own note says so. Nearest thing on this machine to an ordnance-intensity figure, and it has no comparator at any other place. | unverified | atlas.db stal_figure F-FRAG |
| 7 · Airlift thresholds | Four daily tonnages: bare survival, survival plus defence, full combat, and what was actually delivered | 300 · 500 · 750 · 100 tons/day |
Wrong quantity and wrong direction. Supply flown into the encircled pocket, not munitions delivered onto a city. Treating these as ordnance would be exactly the basis error the estate's own register warns of. | none recordable | atlas.db stal_airlift, 4 rows |
| 8 · Monte Cassino entity | Battle record: 17 Jan – 18 May 1944, 41.490 N, 13.8139 E | dates and coordinate only |
Admitted from an external identifier under rule ADMIT-WD-002. Carries zero side rows, and therefore no strength, no casualties and no outcome of any kind. | unverified | atlas.db battle Q335288 |
| 9 · Stalingrad entity, twice | Two battle rows for one battle, under two different admission rules | dates 1942-08-23 →1943-02-02 on one row |
Q38789 carries the dates and coordinate but no sides; the legacy row carries the only two side rows but no dates or coordinate. A count over the battle table double-counts the case, so the case count itself is unstable before any measurement begins. | unverified | atlas.db battle Q38789 · battle-of-stalingrad |
| 10 · Stalingrad strengths | "~1,000,000+ (Stalingrad, Don, and Southwestern Fronts)" and "~1,000,000 (German 6th Army and Axis allied armies)" | no numeric value; low, high, unit all null |
Verbatim source strings. Flagged unparsed, scale structural, measure moment unknown — so it is not even recorded whether these are strengths at the start, the peak or the end. Two figures from one compilation are in any case one witness, not two. |
raw, unparsed | atlas.db strength, sides 81 & 82 |
| 11 · Pocket strength | Axis personnel encircled at the closing of the ring | 290,000 personnel as of 1942-11-23 |
A population trapped, not a defence outcome. The row's own note warns that "trapped" and "German" are different populations, the pocket having held Romanian and Croatian formations and Soviet auxiliaries. | unverified | atlas.db stal_figure F-POCKET |
| 12 · Stalingrad casualties | "Hundreds of thousands killed/wounded; ~91,000 captured"; "Over 1,000,000 total casualties" | prose; confidence field reads "disputed" |
Casualties are not deaths, and these strings mix killed, wounded, missing and captured against unstated denominators. The record's own note reads "casualty estimates vary widely across sources". Monte Cassino is absent from this file entirely. | raw, unparsed | battles.json, battle-of-stalingrad |
| 13 · Ju 52 sortie count | Sorties required to deliver the survival threshold | 172 sorties |
The only sortie count on this machine, and it is not ordnance. A spreadsheet formula, =ROUNDUP(300/1.75,0), dividing the workbook's own 300 t/day threshold by the midpoint of its own 1.5–2 t per-sortie band. Transport flying supply in, computed from two other cells of the same file. It is arithmetic on a scaffold, not an observation. |
T0 scaffold | command-and-tactics.xlsx [summary] r27 |
| 14 · Artillery expenditure rate | Rounds fired per gun on an active day | 20–100 rounds per gun per active day |
The only ordnance-expenditure figure on this machine. A doctrine-generic band with no gun count, no count of active days and no attachment to any place — the note concedes it "varies enormously by phase and doctrine". It cannot be multiplied into a total for any of the four cases without inventing both other factors. | T0 scaffold | command-and-tactics.xlsx [logistics_rates] r18 |
The decision rule's outcome: refused at the gate. The gate in §2 required both variables present, with a stated basis, for at least three of four cases. The count is zero. The test was never reached and no ordering was examined, because there is nothing to order.
The search denominator — the size of what was actually looked through, without which a negative result is only a claim about someone's diligence — is 189 sqlite tables across three databases, 74 sheets across eight reference workbooks, and 170 battle records, comprising 78,065 text units. The sweep carried three positive controls, terms known in advance to be present, so that a sweep matching nothing could be distinguished from a sweep that was broken: rubble returned 14 hits, Stalingrad 59, Monte Cassino 2. All three passed. Ortona returned zero across the entire corpus. Caen returned one, a prose clause about the Normandy campaign inside a single record about the D-Day landings.
Eight strings did match the ordnance pattern, and each was read by hand rather than counted. All eight are the same word doing different work: sortie in its older sense of a sally out of a besieged place, at Carrhae, at the siege of Rome and at Panipat; a warship sortieing from harbour before Midway; tonnage meaning shipping sunk at the Coral Sea, merchant shipping committed to Normandy, and a rate of carrier construction. Two further items, rows 13 and 14 of Table 1, are the closest true approaches and both fail on basis: a count of transport sorties flying supply inward, derived by formula from two other cells of the same workbook, and a generic band of rounds per gun per active day attached to no place, no gun count and no number of days.
The honest reading. Nothing in this corpus supports the claim, and nothing in it refutes the claim. Those are different from each other and both are different from the claim being false, and the distinction is the whole content of this paper. What can be stated positively is narrower and more uncomfortable: the claim is already circulating inside this corpus as though it had been established, and it has not been.
The mechanism row asserts that the bombing meant to break the city built the terrain that held it, and sits in a table with no field for a source. The building typology states, at the row for a rubble field, that bombing improves the defence. The register of general claims elevates the same sentence to tier T2 — a claim held to have passed an internal consistency check — and cites Stalingrad as its lead instance, while its own sourcing field reads: "recall plus the 2026-09-09 conversation. No citation trail, no fresh research… not publishable without a named source."
Three tables, three files, three apparently converging lines. All three carry the same date, all three were written by the same hand in the same pass, and two of them declare in their own metadata that their basis is recall. Under this estate's rule that independence is extractional — that agreement counts as corroboration only when the agreeing statements travelled by genuinely different routes — that is one attestation in three coats, not three attestations. Had this paper been written to its brief, it would have footnoted those three rows beside one another, and would thereby have laundered a single unsourced belief into a corroborated finding. That is precisely the failure the atlas exists to catch, committed by the atlas, and it is the reason the refusal is worth publishing rather than shelving.
The row that fits worst is Monte Cassino, and it fits worst in a way that ought to be uncomfortable. It is the one case other than Stalingrad with a database entity, so it is the case that would have carried the comparison — and that entity is empty. It has a name, two dates and a coordinate, zero side records, and therefore no strength, no casualties and no outcome of any kind. It is also the case where the popular version of the claim is at its most vivid: an abbey bombed to rubble and the rubble then held. The case whose story does the most work for the thesis contributes the least evidence to it. With Cassino empty and Caen and Ortona absent, the study reduces to Stalingrad, and one case is not a comparison; it is the anecdote the study was registered to test.
One further figure deserves naming precisely because it is the sort of thing that gets pressed into service. The corpus records that one building at Stalingrad, Pavlov's House, was held for 58 days. It is the only duration-of-defence figure on this machine, it carries a source reference and its own status field reads unverified, and it measures one building rather than a city. It is not an outcome variable for a case and must not be used as one.
These threaten the refusal, which is the only claim this paper makes.
cover_value is a word grade over twelve building kinds, five of which read plainly "excellent" and two more a qualified version of it. It is the only graded column in the vicinity, and the standing risk is that a later worker converts those words to numbers, correlates them with something and reports a result — reversing this refusal without adding a single measurement. If that appears, it is not a successor to this paper; it is the failure this paper was written to prevent.The claim being retired here is not bombing fortified the city — that claim was never established and so cannot be retired. What is registered is the refusal, and the refusal is checkable by someone who has none of this data.
Retirement state. The registered claim moves to refused_variable_absent, distinct from not supported: nothing was tested, so nothing failed. Reinstatement condition: both variables present with a stated basis for at least three of the four cases, under the §3 rule unchanged, plus one comparison point satisfying criterion 6.
Three consequences follow inside the corpus and are recorded here as owed work rather than performed. First, the mechanism table needs a source field and a confidence field before any row in it is cited again; at present it cannot carry provenance even if someone wanted to add it. Second, the tier-T2 general claim that cites Stalingrad as its lead instance is not adjudicated by this paper — its broader statement about inputs may well survive — but that particular instance is not attested here and should not be quoted as though it were. Third, none of the nine attested-absence records in the atlas covers this gap; all nine concern ancient battles — commanders, identities and quantities at Ur, Kadesh, Lachish, Changping, the Hydaspes and Red Cliffs — so the machinery for recording a documented absence exists and has never once been pointed at a modern case. One should be opened against this absence, carrying the search denominator and the positive-control result from §5, so that the next person to ask this question finds the answer already recorded rather than repeating the sweep.
Every item in Table 1 is addressed in its final column and can be read directly. The databases are war-atlas/db/atlas.db, ops/truth.db and ops/asia/asia.db; the workbooks are the five in ops/reference/ plus three further research workbooks; the battle records are war-atlas/data/battles.json. All were opened read-only.
The search denominator, the positive controls and the 24-cell coverage count in Figure 1 are not described here, they are recomputed by one command:
python ~/ops/papers/ordnance-sweep.py
It walks every table in the three databases and every sheet in the eight workbooks, prints the denominator, runs the three positive controls with their expected minimum hit counts asserted, lists every match for hand-reading, and derives the coverage matrix from the live database rather than from anything written down. As of 2026-09-09 it reports 189 tables, 74 sheets, 170 entries, 78,065 text units, positive controls 3 of 3, and coverage of 2 usable cells, 1 raw-text cell and 21 empty cells of 24. A run that disagrees with any of those figures supersedes this paper's version of them.
Status: refused; figures pending source verification. The two status lines are separate and both apply. Refused is the paper's result and is not provisional. Figures pending source verification applies to every quantity in Table 1 without exception: four are T0 scaffold from workbooks whose own read-me states they were assembled from recall, four carry a source reference with status unverified, two are raw unparsed strings, and two sit in a table with nowhere to record a source at all. Not one figure in this paper has been checked against a named external source, and none should be quoted from here. Publishing at this confidence is deliberate: the contribution is the documented absence and its denominator, and both are improved by someone bringing a real tonnage rather than by waiting.
War Atlas method series, paper 02 · dylanvir.com/war · Registered 2026-09-09 · Class 2 · Refused for want of both variables. This paper makes no claim about bombing and urban defence, and no population claim about cities. A class 3 successor is not merely unwritten but unreachable: it would need the same two variables reported absent here. Recompute: python ops/papers/ordnance-sweep.py.