Darkwood engineering
Procedural terrain, deterministic mutations and interoperable messages with Symfony 8.2

The game concept

A compact isometric world
Terrain mutations
Only mutable cells inside the board advance.
The wrap from high to low makes each pulse reversible.
Procedural generation
The witness proves solvability. It does not claim the shortest or only solution.
Small rules, many situations
Procedural generation reduces authored level data. It does not automatically reduce every other metric.
Godot implementation
for changed in affected:
var before := int(next["levels"][index_of(changed)])
var after := (before + 1) % 3
next["levels"][index_of(changed)] = after
events.append({"cell": changed, "before": before, "after": after})
Generate, mutate and evaluate the authoritative board.
Describe the local columns that changed during one turn.
Interpolate heights and redraw the derived signal path.
Performance and validation
A visible consequence
The board evolves locally. The signal is derived from the resulting state.

Symfony 8.2 cross-application messaging
Owns its local simulation and publishes one accepted fact.
Maps the stable type to its own schema and behavior.
Hypothetical example. Strata Relay remains offline and does not emit this event.
Message identity
message_idWhich logical event is this, across delivery attempts?
correlation_idWhich wider workflow groups this event with related messages?
causation_idWhich earlier command or event produced this one?
#[AsMessage(serializedTypeName: 'game.session.completed.v1')]
final readonly class GameSessionCompleted { /* explicit versioned fields */ }
Conclusion
A seed reconstructs the same playable state.
One action changes a bounded, visible neighborhood.
Connectivity follows the terrain that actually exists.
Applications exchange facts without sharing internals.