FogSim

Sealed deterministic scenario runs with a declared count. A scenario runner invites infinite attempts: run a hundred, publish the three that landed. That is an epistemic problem, not a capacity one, so a FogSim campaign seals a set. Every commitment is published before any run executes, which makes a withheld run visible as a commitment with nothing opened against it.

And the runs are deterministic, which is the stronger property. A run is a pure function of scenario, rules version and seed. A third party does not verify a hash and take the publisher's word for the output — they re-execute the run and get the same output. Recomputation replaces trust.

Verify either campaign yourself:

python fogsim.py verify --hashlog fogsim_hashlog.json \
  --reveal fogsim_reveal.json --scenario fogsim_scenario.json

Campaign 1 — the ceiling

These outcomes were produced by re-executing the runs, not by reading them from a stored file.

sealed 2026-07-27T14:52:26Z · declared 8 runs · 8 commitments · 8 revealed · 0 withheld · scenario hash MATCH · rules fogsim-lanchester/1.0

BLUE 1000.0 at effectiveness 0.0012 · RED 900.0 at 0.0014 · break fraction 0.55 · ceiling 400 ticks

Eight runs, sealed 2026-07-27, all eight revealed. Every run terminated at the 400-tick ceiling without a decision. That was read at the time as a property of the model. It was not: the forces are decisive, and the ceiling cut the run off before the decision arrived. Campaign 2 tests exactly that.
runoutcometicksblue remainingred remainingcommitment
1no_decision4000.6160.573recomputes
2no_decision4000.6140.576recomputes
3no_decision4000.6050.590recomputes
4no_decision4000.6110.588recomputes
5no_decision4000.6070.577recomputes
6no_decision4000.6050.590recomputes
7no_decision4000.6020.574recomputes
8no_decision4000.6140.581recomputes

commitments recompute 8/8 · runs re-executed 8/8 · hashlog · reveal

Campaign 2 — the same forces, allowed to terminate

These outcomes were produced by re-executing the runs, not by reading them from a stored file.

sealed 2026-07-29T00:41:00Z · declared 8 runs · 8 commitments · 8 revealed · 0 withheld · scenario hash MATCH · rules fogsim-lanchester/1.0

BLUE 1000.0 at effectiveness 0.0012 · RED 900.0 at 0.0014 · break fraction 0.55 · ceiling 600 ticks

Identical forces and identical rules version. One parameter changed: max_ticks, 400 to 600. All eight runs resolve. The first campaign's eight non-results were a truncation artefact of a held-fixed assumption, and the first campaign is left sealed and published exactly as it was rather than corrected.
runoutcometicksblue remainingred remainingcommitment
1blue_holds4370.5790.550recomputes
2blue_holds4260.5940.549recomputes
3blue_holds4320.5890.550recomputes
4blue_holds4380.5870.549recomputes
5blue_holds4380.5850.550recomputes
6blue_holds4470.5690.550recomputes
7blue_holds4360.5850.549recomputes
8blue_holds4590.5580.549recomputes

commitments recompute 8/8 · runs re-executed 8/8 · hashlog · reveal

What this does not certify

The scenario represents no real force. Two aggregates under stochastic Lanchester attrition. Verification certifies the integrity of the campaign record — that the count was committed first, that nothing was withheld, and that the outputs recompute. It certifies nothing whatsoever about whether the model resembles war. The verification machinery here is complete and the content behind it is not, and that is stated rather than left to be discovered.

16 runs re-executed on build · 0 withheld across all campaigns

The model, unsealed