A day in the life of the world, and a season that ends properly

milestone season, playoffs, game-day

A season has to be a promise. Thirty match days should mean something even at the bottom of the table, and getting promoted should feel earned instead of arriving as a row change in the database. That is what late May was about, in two landings that arrived a day apart.

The first was a game-day tick that moves the world in a known order: birthdays, availability, suspensions, fitness, training, facilities, finance, transfers, staff. One sequence, every game date, so I can answer "what happened to the world on this day?" without reading logs and guessing. League suspension rules became configurable while I was in there, and the squad page now warns you when a player is one yellow card away from a ban — the kind of thing you only appreciate the week you lose a striker to a booking you never saw coming.

The important decision was keeping match simulation off that tick. Matches run on their own wall-clock schedule. Bundling them into the daily advance is convenient right up to the first time the clock has to catch up several days at once and suddenly you have flooded the queue with fixtures. Ordered phases for the world, a separate schedule for matches. Slightly less elegant as a single cron. Much easier to trust.

The second landing was the ending. After MD30, cross-tier playoffs build their brackets, and the league table freezes by simply not counting playoff fixtures. Promotion and relegation results get written out so next season's groups know who belongs where. Admin and game schedule surfaces both show the playoffs, so the FA and the managers are looking at the same calendar instead of two versions of May.

Frozen standings are correct football and confusing UI, which I knew going in — a table that stops moving while matches are clearly being played needs a banner telling you why, or it just looks broken. I could have skipped playoffs and promoted on points, and it would have been a tenth of the work. But nobody remembers the season they went up on goal difference in a spreadsheet. The trade is more moving parts for whoever is advancing time to look at before they press the button, and for now that whoever is still me.

← All entries