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.jsonCampaign 1 — the ceiling
These outcomes were produced by re-executing the runs, not by reading them from a stored file.
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.
| run | outcome | ticks | blue remaining | red remaining | commitment |
|---|---|---|---|---|---|
| 1 | no_decision | 400 | 0.616 | 0.573 | recomputes |
| 2 | no_decision | 400 | 0.614 | 0.576 | recomputes |
| 3 | no_decision | 400 | 0.605 | 0.590 | recomputes |
| 4 | no_decision | 400 | 0.611 | 0.588 | recomputes |
| 5 | no_decision | 400 | 0.607 | 0.577 | recomputes |
| 6 | no_decision | 400 | 0.605 | 0.590 | recomputes |
| 7 | no_decision | 400 | 0.602 | 0.574 | recomputes |
| 8 | no_decision | 400 | 0.614 | 0.581 | recomputes |
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.
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.
| run | outcome | ticks | blue remaining | red remaining | commitment |
|---|---|---|---|---|---|
| 1 | blue_holds | 437 | 0.579 | 0.550 | recomputes |
| 2 | blue_holds | 426 | 0.594 | 0.549 | recomputes |
| 3 | blue_holds | 432 | 0.589 | 0.550 | recomputes |
| 4 | blue_holds | 438 | 0.587 | 0.549 | recomputes |
| 5 | blue_holds | 438 | 0.585 | 0.550 | recomputes |
| 6 | blue_holds | 447 | 0.569 | 0.550 | recomputes |
| 7 | blue_holds | 436 | 0.585 | 0.549 | recomputes |
| 8 | blue_holds | 459 | 0.558 | 0.549 | recomputes |
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.