Week notes: clicking around like a manager who's never heard of Nest
With the door moved and the librarian gone, I spent the following days doing the unglamorous thing: clicking around the game as if I were a manager who had never heard of Nest.
It's a useful test. A strangler can photograph exactly the right envelope and still leave /transfers sitting in the address bar, fire off a separate request for every tab on a player page, and blow up a club-house widget because somebody coalesced an enum with an empty string. It did all three.
First, the URL tree caught up with the catalogue. Player details collapsed onto a single GET /v2/players/:id?include= instead of a fan of sibling documents. Transfers moved under /v2/market. Inbox, press and club identity stopped impersonating the old paths. Admin settings blobs sat down on /v2/admin/settings/{key}. The leftover club HTTP got split by family, because a package that owns a wage formula shouldn't also be an HTTP mux. None of that changes what a manager sees on a good day. It changes whether the next slice has to guess which name is the real one.
Then the clicks that weren't a good day. Squad bootstrap died on a staff member with no experience band. Tactics bootstrap couldn't scan a null seasonId on a career row. Market bootstrap fell over a left join. Match detail asked for columns Nest never had in the first place. And the club-house Goals widget listed the opposition's scorers, because "the teams in this match" is not "who lined up for my club". Each one is a small defect, right up until you remember they only appear after you've told somebody the API is Go now ๐
.
The club itself moved a bit too. CA and PA stars now rank a player against the senior league group you're managing in โ including when you're staring at your youth side โ instead of a 0โ100 ghost from another era. That's fairer, and it's going to look mean to anyone who carried a mental scale over from the old card. The โฎ on a player grid opens the same context menu as a right-click. Skip on a tour actually dismisses the tour. Expanding a country seeds the youth clubs before the youth league, so you don't end up with a senior pyramid and no U21s under it.
The youth one was more interesting than it sounds. A player named in a youth eighteen can now turn out for the seniors later the same date if he's been moved across โ registration stays exclusive, senior or youth, never both at once, but the same-day block is gone. What happened before was that the whole senior job failed and then the sheet got refilled, and neither of those is how a club behaves. A manager shouldn't lose a fixture because a sixteen-year-old was on a teamsheet in the morning, and he shouldn't find an eleven he didn't pick either.
Finished league and cup matches now ship one Feature rather than a result post. That's the difference between a newspaper and a ticker, and I want a newspaper. Commercial list and accept finally agree with each other. Then offer labels, cup round copy, staff summaries โ the sort of list that never ends and shouldn't.
Ops stays at the surface here, on purpose, since this is a public page. CI runs on the same small machines that host the game. Tests that passed on the merge don't get paid for a second time on the deploy. The queue survives a Pi restart. Cache tags are scoped per club, so one training tick doesn't wipe every manager's squad response. And the local staging client images stamp a real version file, so an old tab notices there's been a rebuild.
The thing I keep having to resist is leftover convenience. A one-to-one URL remap is slower than leaving the old path working. Sibling player requests are familiar until a tab grows a field the sibling never returned. Aliases feel harmless and then /transfers and /market drift apart while you're looking elsewhere. I also passed on printing a second per-position overall next to the stars, which is the fight I already had with myself back in August, and on keeping the youth same-day block as a safety rail โ a rail that fails the job teaches the wrong lesson about Saturday.
Anyway. I can hand this to a tester now without a glossary of which process owns which click, which was the whole point.
Till next time,
Oladapo.