System map
how a live deployment would be arrangedThe demonstration collapses this. Because src/sim is pure TypeScript with no dependencies, the whole world runs in the browser — which is why you can clone this and watch a plant with no database, no keys and no accounts. In a real deployment the world layer is replaced by the ingest layer and everything above it is unchanged. That substitution is the point of the boundary, not a happy accident.
Where data would live
four stores, chosen by access patternNone of this exists in the demonstration. It is stated because the honest answer to "where does the data go" is a design decision with trade-offs, not a shrug — and because getting it wrong is expensive at exactly the point when the system is becoming useful.
Configuration
what is tunable, and where it livesEvery process assumption sits in one file rather than scattered through the model, so that any number the platform produces can be traced back to a stated assumption. That is the same reason a real plant keeps a standards file, and it is what made the domain review possible — a reviewer could read the assumptions without reading the code.
Where a figure is a range the simulation moves within it. Where it is a single value it is a modelling assumption and is marked as one.
The domain model
what the world is made of| Entity | Instances | Notes |
|---|---|---|
| Site | 6 | plants, distribution centres, customer delivery points |
| Furnace | 8 | one colour per campaign, 10–15 years |
| Forehearth | 18 | one per line — the layer that couples furnace to machine |
| Line | 18 | IS machines, sections × gobs |
| Cavity | 566 | each one independently traceable via the mould number |
| Article | 22 | the mould exists or it does not |
| Customer | 12 | large food and beverage manufacturers only |
| Mould set | 0 | physical kits — one place at a time |
| Stock lot | 0 | article × site, with free / held state |
| Connector | 12 | designed integration points |
| Agent | 7 | triggered workers with scoped reads |
Determinism, and why it is a feature rather than a trick
The world is a pure function of a seed and a tick. There is no Math.random() anywhere in the simulation — every random value is a hash of its own coordinates, so nothing is sequenced and nothing can drift. A stateful generator would make every draw depend on how many draws happened before it, which means adding one call anywhere silently changes every number downstream.
Three things follow, and they are the reasons it was built this way:
- Two people opening the same screen at the same tick see identical numbers, so a conversation about what the platform is showing is possible at all.
- Tests can assert exact values rather than tolerances, which is what makes an eval harness for the agent layer worth building.
- Any agent run can be replayed against the exact state it saw. "Why did it do that" has an answer, and the answer is reproducible rather than reconstructed.
In a live deployment the seed is replaced by real telemetry and the determinism moves from the world to the audit trail — the same guarantee, applied to what was actually observed rather than to what was generated.