Maintenance Log
A record of what's changed across the building, oldest first. Filed here mostly so nobody has to ask reception about it.
๐ Building Standards โ Applies To Everything From Here On
- Top social bar. Every page carries the "A Taking Time Back game" bar with Buy Me a Coffee, YouTube, and TikTok, sticky at the top. No exceptions for new floors, games, or tools.
- Rigorous testing, not assumed correctness. Contrast checked proactively before building anything on top of a palette, not after. Every mechanic or rule tested in isolation before it's trusted in the full flow. Every feature tested end-to-end in a real browser, not just validated for syntax. Adversarial and edge cases tested deliberately, not just the case the feature was built for โ including the "should NOT trigger" case, which matters as much as the case that should. Fallback paths (clipboard, reduced motion, empty input) tested directly, not assumed to work because the primary path does.
- Depth and detail over reskins. Every floor, game, and tool gets its own genuinely distinct visual identity and signature element, built around what it's actually about โ not an existing one with the colours swapped. If two things on the same floor would look interchangeable with the labels removed, that's a sign to go back and differentiate them properly.
- Humour that's specific, not generic. Jokes are grounded in something real and identifiable about the situation being satirised โ a real piece of jargon, a real recognisable moment โ not filler placeholder wit that could apply to anything.
- Savagery where the joke earns it. Willing to be genuinely cutting when the target is the technique, the system, or the situation. The standing line stays: never the person. If a joke only works by aiming at whoever's using the tool rather than what they wrote or did, it doesn't ship.
- The rest of the established kit, applied by default unless there's a specific reason not to: a working day/night toggle on the shared site-wide preference key, a share feature with genuinely distinct share text (not one template with names swapped), a console easter egg in the house voice, a how-it-works modal, achievements where the format supports fair comparison between people โ and explicitly skipped where it wouldn't, as with the diagnostic Utilities tools that take arbitrary input. On language: checked across every individual game before assuming an answer rather than guessing โ the hub itself carries full five-language i18n since it's the one page that sets the preference, but individual game pages are predominantly English-only by established pattern, with IT Support and Hall of Shame as early exceptions rather than the rule. New games match the dominant pattern โ English-only โ unless there's a specific reason to do otherwise.
Update 1
Opening Day
- The building opens: IT Support Simulator, Payroll Support Simulator, and Corporate Buzzword Simulator go live.
- The hub launches as the building directory, with a floor for each game.
- 151 caller archetypes, achievements, and full playstyle-based endings ship with IT Support Simulator.
Update 2
Records Office
- Hall of Shame opens in the basement โ cross-game leaderboards, no sign-up required.
- Scores now save automatically when any game ends.
Update 3
Facilities Work
- The Lift Button installed in the sub-basement. Five floors. Escalating odds.
- An animated hub worker appears in the building โ click them.
- The Site Lead makes an appearance. Floors occasionally close without warning. This is, allegedly, unrelated to the Cronyism Index.
Update 4
New Tenant
- Hot Desk Simulator opens. Claim a desk before the Morning Huddle.
- Later reworked into a proper hidden-information puzzle โ every desk starts unchecked, and checking one reveals a number showing how many occupied desks are nearby.
Update 5
Structural Renovation
- The hub is rebuilt as an actual building cross-section: a sky up top, floors stacked in order, a pavement at street level, and basement levels below.
- The hub worker moves down to the pavement and now walks it, rather than standing still.
- A day/night toggle is added โ the sun and moon swap places, and the sky, building, and lit windows all shift with it.
Update 6
Ground Floor Opens
- Reception opens at ground level. Call the surgery. Try to get an appointment.
Update 7
Breakroom Installed
- Watercooler Simulator opens. Survive the workday's small talk without your Social Battery running out or landing on HR's Radar.
- Later reworked to use a real-time timing ring instead of a simple choice menu โ timing, not just picking, now determines the outcome.
- Moved up to Floor 1, on the basis that a breakroom belongs closer to ground level than the sub-basement.
Update 8
Facilities Follow-Up
- Ambient music added to The Lift Button, with its own toggle in the topbar.
- The Hall of Shame moves to top 10 boards across every game, building-wide.
- A building-wide pass: every clickable thing was checked to make sure it does something, and has a sound to go with it.
- Dialogue and flavour-text pools expanded across several games, and a batch of new, genuinely hard achievements added throughout.
Update 9
Deepest Sub-basement Opens
- Shop Floor Simulator opens at B3 โ the building's first top-down game. Pick up delivery from the staff-only base and get it out onto the shelves, dodging customers, colleagues, management, and the odd hazard along the way.
- Occasionally you're called to work a till, whether you're ready or not.
- A toggle switches the store's branding between a US-style and a UK-style parody name.
Update 10
Street Level Gets Busier
- A second figure now walks the pavement alongside the original hub worker โ a delivery driver, on their own schedule, with their own things to say.
- The original worker's remarks now vary by time of day, on top of the existing pool.
- Clouds drift across the daytime sky.
- A new badge tallies achievements earned across every game in the building, with a breakdown by floor on request.
Update 11
A Few More Things Worth Noticing
- Keep an eye on the building's exterior. Not everything up there is decorative.
- Something's moved into the basement too. It has a lot to say, if you're patient.
- A few spots around the building are now reserved for future partners โ currently just placeholder space, nothing live yet.
Update 12
Street Level Has A Few New Regulars
- Someone new does the rounds at night. Worth a tap if you catch them.
- A cat has moved in. It answers to no one and interacts with things in its own way.
- The weather now occasionally does something other than "fine."
- The building keeps a running (fictional) rumour mill near the top of the page.
- A new badge rewards actually visiting every floor in the directory, not just playing the games.
- December brings its own look to the place. Check back then.
Update 13
Floor 2a
- Jargle has opened on Floor 2a โ one piece of corporate jargon a day, guessed the way you'd expect, scored the way you wouldn't. Solving it fast is not the flex you think it is.
- Floor 2a exists because a whole extra floor for corporate buzzwords wasn't in the original planning permission. We built it anyway, next to the floor it's clearly a symptom of.
- Nine achievements live there. A couple require actually paying attention to what the building's other regulars are up to.
Update 14
Sub-basement 5 Is Open
- Old MacDonald's has cleared inspection. The tape's down, the till's live.
- 25 achievements, covering streaks, surviving a customer's mind mid-order, keeping the fryer and grill from catching at the same time, and a full menu completionist run.
- Now submits to the Hall of Shame, same as every other floor with a till.
- The Legacy Systems prototype has been retired โ it covered too much of the same ground as Generational Standoff to justify both.
Update 15
Floor 1a: Facilities
- Three stalls, next to the Watercooler. One's occupied. One has notes left by previous occupants. One turns absolutely anything into a leadership lesson.
- The third stall runs on the same logic as Floor 2a: the more insufferable the post, the better it's treated as "performing" โ and posting something genuinely humble is the actual achievement.
- 11 achievements, including one for hitting maximum cringe three times running.
Update 16
Thought Leader Gets A Proper Overhaul
- Nearly double the content across every bank, and a fifth section: Formatting. Choose badly there and watch your own post get mangled live โ random CAPITALIZATION, sentences broken into fragments, grammar that should carry a fine. Each one gets called out by name.
- Posts now come in weeks of five, with a running average and a proper end-of-week verdict โ averaging viral tier across a full week is its own, much worse achievement than any single post.
- 15 achievements total now, up from 11.
- The day's situation โ the thing you're actually meant to be turning into a post โ used to be small grey italic text, easy to miss entirely. It's a proper labelled card now.
Update 17
Sub-basement 6 Is Open, And A Building-Wide Consistency Pass
- Front of House has cleared inspection โ 18 achievements, Hall of Shame submission, the lot.
- Every floor in the building now has a working light/dark toggle. Four floors had one hardcoded with no way to change it; that's fixed. Two floors had nothing at all; that's fixed too.
- Bathroom now submits to the Hall of Shame, and both Bathroom and Jargle have proper sound now.
- Building-wide achievement total is 291.
Update 18
Floor 4B
- Generational Standoff has a real address now โ right next to IT Support, exactly where the puzzle's own goal squares always said it happened.
- 19 achievements: one for winning on each difficulty, surviving both Nightmare-mode chaos events, a three-day Daily Challenge streak, and the quieter ones โ a clean win with zero friction, walking away with Clock Out.
- Now submits to the Hall of Shame. Theme toggle, same as everywhere else.
- Building-wide achievement total is 310.
Update 19
Someone Turned The Lights On
- Every floor's text checked against WCAG contrast standards, in both light and dark mode, not just eyeballed.
- Six real problems found, all in colours picked to "pop" against dark backgrounds that turned out too light for the white text sitting on top โ Lift Button, Hot Desk, Reception, Watercooler, and Bathroom's own Change button.
- IT Support and Payroll had the same issue lurking since long before dark mode existed โ a bright blue and red used for badges and buttons that never quite cleared the bar even against the original light background.
- Corporate Buzzword checked out clean throughout โ one button colour in light mode was borderline and got a proper fix.
Update 20
Small Fixes And A Proper Flip
- Front of House and Generational Standoff finally have their correct folder names live โ a browser upload had silently left them under their old prototype names, so the hub was linking to pages that didn't exist.
- Jargle's How To Play now says outright that targets can be full phrases squashed into one word, so REACHOUT and CIRCLEBACK stop looking like they shouldn't count.
- Jargle's letter tiles do a proper Wordle-style flip on reveal now โ staggered, one at a time, colour swapping mid-flip while the tile's edge-on and invisible. Timing scales with word length, so a 15-letter Tuesday doesn't take three seconds longer than a 5-letter one to finish revealing.
Update 21
Jargle Gets A Real Dictionary
- Guesses now have to be real words โ a proper English dictionary check, 75,000+ words, sourced from the system's own hunspell wordlist rather than anything hand-typed.
- Every single target word is guaranteed guessable regardless, including the 85 compound jargon terms and acronyms (REACHOUT, CIRCLEBACK, KPI, and the like) that no standard dictionary would recognise on its own.
- A raw word list this size would run to roughly 800KB, which is not a reasonable thing to load for a word game. Compressed it down using a front-coding scheme โ each word stores only what's different from the word before it, since a sorted list is mostly shared prefixes โ bringing the real transferred size to a much more sensible ~160KB.
Update 22
You Can Actually Install This Now
- Clock In Sims is a proper installable app now โ "Add to Home Screen" on Android, "Add to Dock" on Safari, opens full-screen with no browser address bar, and works offline for anything already visited.
- The whole building, one install โ not a separate icon per game. Opens straight to the directory, every floor still reached the normal way from there.
- New icon: a dark building silhouette against a night sky, a few lit windows, a brass roofline โ pulled directly from the hub's own existing colour palette rather than inventing a new one.
Update 23
Front of House Board Overhaul
- The token actually moves now โ hops square by square on a normal roll, a distinct climb or slide for ladders, snakes, and getting sent back to base. It used to teleport instantly with no motion at all.
- Every ladder and snake now draws a faint line connecting where it starts to where it ends, so the board's own logic is visible at a glance instead of something you only discover by landing on it. The destination square is marked too โ previously it looked like nothing had happened when you landed there.
- Removed the tiny corner square numbers and gave every square type a bolder, more distinct colour instead of translucent overlays that were blending into the background.
- Respects reduced-motion preferences properly โ checked in both CSS and the JavaScript timing itself, not just the stylesheet, since the hop sequence is driven by script delays that a CSS override alone can't touch.
Update 24
Every Floor's Signed Now
- The Taking Time Back credit bar and social links (Buy Me a Coffee, YouTube, TikTok) were only ever on the seven earliest games. The seven built since โ Shop Floor, Jargle, Old MacDonald's, Front of House, Bathroom, Generational Standoff, and Hall of Shame โ never had it. All fourteen match now.
Update 25
Building-Wide Contrast Pass
- Front of House's topbar name was genuinely unreadable in light mode โ white text on a background that goes near-white in that theme, down around 1:1 contrast. The same mistake had made it into four other games during an earlier batch (Shop Floor, Old MacDonald's, Generational Standoff, plus Front of House itself).
- Went further than the one report โ audited every colour that pairs a fixed or variable text colour against a variable background across all fourteen games, properly, checking only combinations that can actually occur together rather than cross-testing colours from different themes that never appear on screen at the same time.
- Found and fixed real issues well beyond the original report: badges in IT Support and Payroll, Jargle's tile and key colours across two of its four palettes, a keyboard-hint colour in Payroll, and several muted-text pairings sitting just under a safe reading threshold across five other games.
- Re-ran the full audit after every fix. Zero contrast issues remain across the entire project.
Update 26
Front of House, 1โ4 Players
- Pass-and-play, one device, up to four people. Each player gets their own token and colour, turns rotate automatically, first to close the shift at table 64 wins.
- Solo mode is untouched โ same 18 achievements, same Hall of Shame submission, same everything. Multiplayer deliberately skips both; four people sharing a device isn't a fair leaderboard entry for any one of them, so it's just for the table, no tracking attached.
- Every mechanic works the same across both modes โ ladders, snakes, stuck tables, decisions, the lot โ just running per-player instead of on one shared position.
Update 27
The Daily Puzzle Stays The Daily Puzzle
- Generational Standoff's difficulty buttons no longer let you quietly wander off mid-daily-attempt โ they lock the moment today's puzzle starts, and stay locked until you actually finish it or clock out.
- Clock Out still works exactly as before, as the genuine way to leave one unresolved if you want to. This only closes off the accidental exit.
Update 28
A Proper Dice Roll
- Front of House's dice used to just swap to the result instantly, no roll at all. It actually rolls now โ a rapid cycle through random faces before settling on the real one, with a little bounce on landing.
- The dice itself is tappable now too, not just the Roll button โ works identically either way, including in multiplayer.
- Hall of Shame's leaderboard rows fade in one after another now instead of all appearing at once.
- Audited the rest of the building for the same kind of gap. Most games already have decent feedback on their core interaction โ sound, toast notifications, achievement pop-ins โ so this wasn't the systemic issue it might have looked like. The one genuinely comparable gap is Generational Standoff, where pieces still teleport instantly on a full board rebuild, the same issue Front of House had before its overhaul. That one's a proper undertaking on its own, not something to rush into the same pass as everything else โ flagging it as the clear next candidate rather than doing it shallowly here.
Update 29
Generational Standoff: Starting Positions Now Randomised
- Every generation used to start in the exact same corner, every single time โ boomer top-left, genz bottom-right, forever. Starting quadrants and the exact cell within them now shuffle on every new layout, alongside the obstacles.
- This runs through the same solvability check as the obstacles always have โ a random start and obstacle set only ever gets used once it's been verified genuinely completable within the move limit. Tested across 200 generations spanning all four difficulties: zero unsolvable layouts, zero pieces overlapping each other, an obstacle, or a goal square.
- Daily Challenge stays properly shared โ same date still produces the exact same starting positions for everyone, verified by regenerating from an identical seed twice and confirming byte-identical results.
Update 30
Floor 4C: Meeting Tetris (now Diary Block)
- New floor, new wing of the meeting-room cluster alongside Generational Standoff. A genuine falling-block engine โ seven standard pieces, each one a meeting type (All-Hands, 1:1, Stakeholder Alignment, Status Update, Reschedule), plus an eighth: "This Could Have Been An Email," oversized, and it does not rotate.
- The resource you're actually protecting isn't a score, it's Focus Time โ drains on its own as the day goes on, drains harder every time a meeting lands, and only comes back by clearing a slot. Run out, or let the stack reach the top, and the day's over either way.
- Every 24โ34 seconds, your Calendar Assistant finds a gap you left and fills it without asking. This can't be turned off. That's the point.
- Tested the collision system directly rather than trusting it by feel โ confirmed wall collision holds exactly at the edge, a hard-dropped piece lands in the exact expected cells, a completed row clears and everything above shifts down by exactly one with nothing lost or duplicated, and a genuine four-row Tetris clear fires its own achievement. All 19 achievements verified individually.
- Caught and fixed a real contrast issue in this one before it ever shipped โ white button text against the teal accent came out at 2.93:1 in dark mode, the same category of mistake found and fixed across the rest of the building recently. Went straight to a dedicated background-only variable rather than compromising the accent colour's other job as on-panel text.
Update 31
Sharing Actually Shares Something Now
- Jargle's share button used to copy the bare Wordle-style grid and nothing else โ no link, and none of the game's own roast lines that already exist and already fire on every result. Now includes the actual verdict ("๐ฌ CONCERNING", "๐ฉ CAUGHT", whichever one you earned) with its line, alongside the grid and a link to the game.
- Checked the rest of the building rather than assuming Jargle was the only gap. IT Support, Payroll, and Corporate Buzzword already did this properly โ their own flavour line, stats, and a link, all in one share. Generational Standoff and Watercooler had no sharing at all; both now match the same pattern.
- Every one of these now tries the device's native share sheet first โ straight to Messages, WhatsApp, wherever โ falling back to clipboard copy only where that's not available.
Update 32
Meeting Tetris (now Diary Block) Gets Properly Cursed
- Fair question, and the honest answer was no โ the theme was cursed, the actual feedback loop wasn't. Score only ever went up for doing well, no different from any other Tetris. Jargle already proves the bit lands better when success gets punished, not just survival.
- Three additions, each reusing a system already in place rather than bolting on something new and risky. Clear a row that included "This Could Have Been An Email" and it barely counts โ a sixth of the usual Focus Time back, with a toast that says so. Clear two rows back to back within 15 seconds and your Calendar Assistant gets noticeably more aggressive for a while โ "keeping up" is treated as evidence you have room for more. Land a genuinely good multi-row clear and there's a real chance the reward is next piece guaranteed to be the email one, on a 20-second cooldown so it reads as a nasty surprise rather than a predictable tax.
- Tested each in isolation before trusting them together โ confirmed the reduced recovery amount exactly, confirmed the assistant's timer reference genuinely changes (not just a toast implying it does), confirmed the compliment mechanic forces the next piece correctly and respects its own cooldown on an immediate second attempt. Re-ran the full regression pass on hard-drop and both game-over conditions afterward to confirm none of it disturbed what already worked.
- One new achievement for the hat-trick of backhanded rewards. Twenty total now, all fourteen games' running total moved to /330.
Update 33
Music, Against Everyone's Better Judgement
- An original composition โ not a transcription of any specific game's soundtrack โ built to sit somewhere between the brisk, minor-key energy classic puzzle-game music runs on, and the soft, sterile tone of a corporate video-call ringtone. Every two loops through the main melody, it gets rudely interrupted by an "incoming call" motif before returning to where it left off. The music gets meetings dropped on it too.
- Tempo quietly tightens as your pace increases in-game, capped so it never gets genuinely unplayable. Own toggle in the topbar, separate from the sound effects switch, since "cursed on purpose" and "wants it on for twenty minutes straight" aren't always the same person.
- Caught a real bug in testing rather than after the fact: the safeguard meant to restart music after browser autoplay restrictions block it was itself calling back into the function that triggers it, creating genuine infinite recursion โ a real stack overflow, not a hypothetical one. Found it because a test exercised a genuine first-user-gesture scenario rather than assuming the happy path, fixed by splitting the two functions apart so neither calls back into the other, then re-ran that exact same test to confirm the fix actually held rather than trusting the fix by reasoning alone.
- Also verified the parts that don't show up as errors when broken: the scheduler's internal clock genuinely advances against real elapsed time rather than just existing, the main-to-interruption-to-main cycle completes correctly, tempo scaling produces the right numbers at three different pace levels, and music correctly stops on pause and game over rather than continuing to play under a frozen board.
Update 34
The Difficulty Actually Goes Somewhere Now
- Asked directly whether this had the potential for the kind of stupidly-high-level chase the NES original is famous for. Checked the actual formula rather than assuming, and the honest answer was no โ drop speed hit a hard floor at level 11 and sat there identically all the way to level 30 and beyond. The "Pace" number on screen kept climbing the whole time while nothing about the game was actually changing. Worse, scoring was completely flat regardless of level, so there was no reason to survive into anything brutal even if the speed had kept increasing.
- Replaced the hard cap with a curve that keeps meaningfully tightening well past where the old one gave up โ level 11 and level 30 are now genuinely different speeds, and it keeps asymptotically approaching (never quite reaching) its floor indefinitely, so the level number climbing always means something.
- Scoring now uses the same tiered line values real Tetris does, multiplied by the level a clear happens at โ the same four-line clear is worth 800 points at level 1 and 24,000 at level 30. Verified this exactly, not approximately.
- Two more pressures now scale with level rather than just speed: passive Focus Time drain gently increases (capped at double the base rate), and the Calendar Assistant's patience shortens the deeper you go. Getting past the early game should mean genuinely more is coming at you, not just faster blocks.
- Level 29 gets a direct, explicit nod โ a "The Kill Screen" achievement fires exactly there, for anyone who knows what that number means. One further marker exists for anyone who pushes well past it.
- Raised the Hall of Shame score ceiling substantially to match โ the old one was tuned for the flat-scoring formula and would have wrongly rejected a genuinely exceptional deep run under the new one.
Update 35
The Pieces Actually Behave Like The Meetings They're Named After
- Fair follow-up question: the pieces were standard tetrominoes with meeting names stuck on them, nothing about how they actually played reflected what they claimed to be. Fixed that properly rather than cosmetically.
- ๐ค 1:1s cost the normal amount but give a little extra Focus Time back when cleared โ they're genuinely useful, and now the only piece type that's a net positive. ๐ข All-Hands cost more than everything but the email piece on landing, because they always do. ๐ Reschedules have a real one-in-three chance of forcing another Reschedule to spawn immediately after, because that's genuinely how they behave in real life โ verified this fires the correct replacement piece and, just as importantly, verified it correctly does nothing the other two times out of three.
- Piece frequency is weighted now instead of every type being equally likely โ 1:1s and Status Updates fill most of a normal day, All-Hands are rare but land harder when they show up, matching how an actual calendar skews. Verified the exact weighting holds over 200 sampled bags before trusting it.
- Every piece gets its own icon now, shown next to its name as it falls, so identity reads at a glance rather than only by colour.
- Left Stakeholder Alignment and Status Update mechanically plain on purpose rather than inventing a twist for every single piece โ most of a real day is routine, and that contrast is doing real work: the notably good and notably bad meetings stand out precisely because most of what falls on you is neither.
Update 36
Meeting Tetris Is Now Diary Block
- "Meeting Tetris" was always just describing the mechanic, never an actual name. Renamed properly rather than cosmetically โ new folder and URL (
/diary-block/, the old path is gone rather than left as a stale duplicate), new title and meta tags, the floor tile and its blurb across all five languages, Hall of Shame's board id and label, both backend leaderboard functions, and every localStorage key (mt-* โ db-*) and internal score variable. Checked the whole project afterward for anything still saying "meeting-tetris" rather than assuming the rename was complete.
- New tagline, in-game only by request: "The ultimate calendar cock-block." Sits as a subtitle right under the name in the topbar.
- The two changelog entries above that predate the rename keep their original titles rather than being silently rewritten, with a note added connecting them to the current name โ this is a running record of what actually happened when, not a document that gets quietly edited to pretend a name was always the name.
Update 37
Pre-Launch Audit, And One Real Gap Found
- Before this went live: re-ran the full contrast audit specifically on Diary Block given how much was added to it this session, checked the PWA manifest and service worker for anything now stale, verified the achievement total math, and ran a JS syntax sweep across all sixteen files in the project โ not just the ones touched recently. Everything came back clean.
- One real gap did turn up: every other mature game in the building can generate a shareable result โ its own flavour line, the stats that matter, a link back โ and Diary Block, built after that pattern existed, never got it. Added properly rather than as an afterthought: level reached, score, and slots cleared, pulled from the game's own result text rather than a separate hardcoded message. Caught and fixed a duplicated emoji in testing before it shipped, where the result title's own icon collided with a second one added on top.
- The tagline stays exactly where it was scoped to โ in-game only. The shareable text uses the game's own generated lines instead, since a message going out to someone else's inbox or group chat is a different context than the topbar.
Update 38
Jargle's Share Was Spoiling The Word
- Real bug, reported directly: losing a round shows the target word on screen, which is exactly right โ you've finished your attempt, you've earned it. That same line was getting pulled straight into the shareable text, meaning anyone who lost and shared their result was handing the answer to everyone else who hadn't played yet. The one thing a Wordle-style share is never supposed to do.
- Fixed by keeping two separate copies of the result line from the moment it's generated โ the full one with the reveal for the screen, and a second one with the word-reveal sentence never appended in the first place for anything that leaves the game. Not a matter of stripping the word back out afterward, which is easy to get subtly wrong โ the spoiler text is simply never constructed for the share path at all.
- Verified directly rather than by reading the code and assuming it was right: forced a loss, confirmed the on-screen line still contains the target word exactly as before, then confirmed the actual generated share text does not contain it anywhere. Checked the win path immediately after too, since that one was never broken and needed to stay that way โ confirmed word-for-word identical to before this fix.
Update 39
Diary Block Now Actually Fits On A Screen
- Real, measured problem: the board's height was derived from its width via aspect-ratio, with zero awareness of how much vertical space the phone actually had left after the topbar, HUD, focus bar, and message bar. On a genuinely common phone height, the controls at the bottom โ the buttons that move and rotate the piece โ sat below the fold. Confirmed this precisely before touching anything: at 800px of viewport height, the action row's own bottom edge measured 849px. Not a hunch, a number.
- Fixed the actual mechanism, not just the symptom โ flipped which dimension drives which. The whole page is a proper height-constrained flex column now, so the board's height comes from whatever space is genuinely left after every other fixed element is accounted for, and its width follows from that via the same aspect-ratio as before. Tested against nine real configurations afterward: four viewport heights from 667px up, plus five actual device profiles from a small Android phone through an iPhone 14 Pro Max. Zero overflow on any of them.
- Checked the parts that don't fail loudly when a layout change goes wrong: confirmed the board still isn't directly interactive so a smaller board on the tightest device is a visual-only trade-off, not a playability one; confirmed the achievement list can still scroll internally even though the page itself no longer can; reran the full regression suite โ wall collision, hard drop, achievement count, both toggles โ and the contrast audit, since this touched enough core CSS that assuming nothing else moved wasn't good enough.
Update 40
The Hub Explains Itself Now, And A Real Install Button
- Three new buttons on the hub, next to the language switcher: what this actually is, how the building works โ floors, achievements, the Hall of Shame, all of it โ and a genuine install button, not just static instructions pointing at a browser menu.
- The install button actually adapts to what's possible rather than assuming one path works for everyone. Where the browser supports it, tapping it triggers the real native install prompt directly. On iOS, where that API doesn't exist at all, it shows the actual manual steps instead. If the device already has it installed, it says so rather than offering to install it again. Anywhere else, an honest fallback rather than a broken button pretending to do something it can't. Tested all four of these directly โ forced each condition and confirmed the right one fires, not just that the happy path works.
- Found something genuinely broken while wiring this up, unrelated to what I was building: the code already had multiple places quietly referencing a language-tracking variable that was never actually declared anywhere in the file. It would have thrown outright the moment any of those paths ran โ the building randomly "closing" a floor, certain toast messages โ quiet failures nobody had likely hit yet, sitting there waiting. Fixed at the source with one correctly-scoped variable rather than patched around individually, which fixed my new code and every one of those pre-existing dead ends in the same move. Confirmed the fix by deliberately triggering one of the old broken paths afterward and watching it complete cleanly.
- Also found two pre-existing contrast failures while auditing my own new addition โ the language switcher buttons and the ad-space label had been sitting at 4.21:1 in light mode, just under the safe threshold, since before this session touched them. Same root cause as my own new button, so one shared fix resolved all three rather than three separate patches.
- All three new buttons and every word in their modals are in all five languages, including the install flow's dynamically generated content โ the iOS steps and the fallback message pull from the same lookup the rest of the site uses, not a separate English-only exception.
Update 41
The Daily Puzzle Lock Had A Second Door Left Open
- Reported directly: the daily challenge could still be abandoned via "๐ฒ New Layout" mid-attempt. This is a real gap in the original fix, not a new regression โ that earlier work locked the Easy/Standard/Hard/Nightmare buttons and
setDifficulty() itself, but New Layout calls a completely separate function, newLayout(), that was never touched at all. Checked the actual code before assuming anything, and confirmed it: zero guard on either the button or the function.
- Fixed the same way as the original โ locked at both the button level and inside the function itself, so a direct call bypassing the UI is blocked exactly as it already was for the difficulty selector.
- Reran the same lifecycle testing the original fix went through, not a lighter pass: confirmed the button is enabled outside daily mode, confirmed it locks the moment a daily attempt starts, confirmed a direct function-call attempt during an active attempt is genuinely blocked โ checked by comparing the actual obstacle layout before and after, not just that the button looked disabled โ and confirmed it correctly re-enables after both a clock-out and a genuine win, then correctly re-locks again the moment a fresh daily attempt begins.
Update 42
The Cringeometer Goes Live, And A Building Directory
- Floor 1b, right next to the Bathroom it was always meant to sit beside. Prototype tag removed, floor tile added, all five languages, folder href tracked properly. No achievements or Hall of Shame for this one โ it analyses whatever arbitrary text someone pastes in, so there's no fair basis for a leaderboard, and forcing one in just to match the pattern would have been pattern-matching over sense.
- New building directory, styled like an actual lobby sign rather than a re-skinned floor list โ fixed dark board with brass lettering regardless of day or night mode, since a physical sign on a wall wouldn't change with the building's lighting. Sixteen floors, tap any one to go straight there. Built the floor list programmatically from the real tiles rather than retyping it by hand, specifically to avoid the exact kind of mismatch that would otherwise sneak in unnoticed โ and the first extraction attempt proved the point by doing exactly that, pairing the Lift Button with the wrong href before the extraction logic got fixed.
- Found a real, live bug while building this that had nothing to do with what was being built: the three info buttons added a few sessions back โ About, How This Works, Install โ were never actually showing their icons. The emoji had been written as JavaScript-style unicode escapes sitting directly in the HTML body, and HTML has no mechanism to interpret that syntax at all โ it only works inside an actual JavaScript string. Every visitor since those buttons shipped has been looking at literal backslash-u text instead of icons. Checked the rest of the file for the same mistake before calling it fixed โ found six more matches, confirmed all six were correctly inside script tags as real JavaScript strings, and verified one directly to be sure rather than assuming the category was safe.
Update 43
Fully Loose, And A Fake Loading Sequence
- Rewrote all twenty-two exhibit lines, all five verdicts, and all twelve honest-translation lines to hit considerably harder โ sharper, crueler, less hedged. Kept one boundary in place on purpose while doing it: every rule still roasts the technique, never the substance. Someone's actual hardship was never the target and still isn't; what's target practice is the rhetorical machinery built on top of it. Punching up the savagery doesn't mean punching down at the people using this on themselves.
- New loading sequence between hitting "Flush It Through" and the result landing โ the needle doesn't just jump to the answer anymore. A shuffled run of in-character status lines cycles for about two seconds first: cross-referencing the buzzword database, asking HR for comment, locating the humility if any. Purely theatrical โ the actual analysis is instant either way โ but a diagnosis that arrives instantly reads as a lookup, and one that takes a beat reads as a verdict. Respects reduced-motion for the spinning icon specifically, since that's the one purely decorative animation in the sequence; the text cycling itself isn't a motion concern and stays regardless.
- Tested the sequence itself, not just that it eventually finishes: confirmed the run button disables the instant it's clicked so a rapid second tap can't overlap two timers, confirmed the status text is actually different at three separate points during the run rather than frozen on the first line, confirmed a stale "Unclogged Version" card from a previous result correctly disappears the moment a new run starts rather than sitting there looking like leftover output, and confirmed the real score at the end still comes out correct after the fake delay.
Update 44
The Directory Shrinks Down To A Button
- Fair call: even collapsed to seven rows, the building directory was permanently occupying real space on the hub for something that's fundamentally a lookup tool, not a thing anyone needed sitting open by default. Replaced it with a fourth button next to About, How This Works, and Install โ same family, same size, one more tap target instead of a standing fixture.
- The modal it opens now carries more information than the old board did, not less โ every one of the sixteen floors gets its own one-line description alongside the name, written fresh for this rather than trimmed down from the floor tiles' longer copy. All ninety-five new strings across the five languages, not just English with the rest following later.
- Removed the toggle-based expand/collapse logic entirely rather than leaving it dormant in the file โ it had no reason to exist once the whole thing lives behind a single open/close action, and dead code with no caller is just a future maintenance trap wearing a disguise. Confirmed nothing else referenced those four strings before deleting them, then reran the full i18n completeness check afterward to make sure the cleanup hadn't quietly taken a genuinely-needed key down with it.
Update 45
The Building Notices You Opening The Console
- IT Support has had a friendly "oh, a fellow developer" console message for a while now. This is the meaner sibling โ fifteen games, each catching anyone who opens dev tools with something specific to that floor rather than a copy-pasted line with the game name swapped in.
- Jargle gets the sharpest version, since it's the one game where opening the console genuinely can hand someone today's answer โ the target word sits in the JS the same way it has to in any client-side word game. Rather than pretend otherwise, it calls it out directly and ties the joke straight into the existing CAUGHT mechanic: win after reading the source and the title still says CAUGHT. The one-guess roast doesn't know the difference, and now neither do you.
- Caught a real bug partway through this batch rather than after: Hall of Shame's line quoted a phrase in double quotes inside a string that was also double-quoted, which breaks the string the moment the parser hits the first internal quote mark. Node's own syntax checker caught it immediately, rather than it slipping through on the assumption that fourteen near-identical successes meant the fifteenth would behave the same way. Switched that one line to single-quote delimiters and reran the checker to confirm the fix actually held.
- Validated every single file afterward, not just the ones touched last โ full JS syntax check and CSS brace balance across all fifteen, then confirmed each one's easter egg genuinely fires in a real browser context rather than trusting that valid syntax meant correct behaviour. Spot-checked core gameplay on the more complex games afterward too, since inserting text at the top of a script file is low-risk but not zero-risk.
Update 46
A Genuinely Cringe Post That Scored Zero
- Reported directly, with the actual post attached โ a real work-experience reflection, dense with soft-skill listing, an anniversary hook, and a closing "I'd love to hear your experiences in the comments," scored a flat zero. Ran the exact text through the engine before touching anything, confirmed it genuinely hit nothing, and went looking for why rather than assuming the report was wrong.
- Four real, separate gaps, not one bug wearing different clothes. The buzzword list had never included "collaboration," "teamwork," "resilience," or "soft skills" at all โ an entire common vocabulary of corporate-speak the detector was structurally blind to. The engagement-bait pattern caught "comment below" and "thoughts?" but not the extremely common "I'd love to hear... in the comments" phrasing this post actually used. And two whole categories had no rule at all: the anniversary-reflection hook ("today officially marks a year since"), and "had the privilege of" as a quieter cousin of "I'm humbled to announce."
- Fixed each one specifically rather than papering over the symptom with a blanket score adjustment. Expanded the buzzword list to cover the soft-skills vocabulary this post lives on. Broadened the engagement-bait pattern to catch the phrasing that was actually missed. Added two new rules for the two genre gaps, plus a fifth for stringing four or more soft-skill nouns together in one breath, which this post also does. Re-ran the exact reported post afterward: zero to seventy-five, five accurate hits, each one quoting something the post actually said.
- Checked the blast radius before calling it done, not just the one post that got fixed: the original boring test post still scores zero with no new false positives from the widened buzzword list, and the original maximum-cringe test post still caps at 100 โ with one additional genuine hit now firing that hadn't been before, which is the expansion working as intended rather than a side effect to worry about.
Update 47
Name-Dropping Wasn't Actually General
- Asked directly whether the employer-namedrop rule looks for company names generally. Checked rather than assumed: it only matched one exact structure, "dream role/job at [Company]." Anyone who wrote "thrilled to join Google" or "proud of the team at Deloitte" instead was invisible to it entirely.
- Widened it to also catch joined/joining, team/colleagues at, and offer from, alongside the original dream-role phrasing โ the common shapes this kind of announcement actually takes, not just the one that happened to get built first.
- Found a genuine bug while building the wider version, before it ever reached the live file: applying case-insensitive matching to the whole pattern also made the capital-letter requirement on the company name itself stop meaning anything, since
/i flattens [A-Z] into matching any letter at all. "joining Meta next month" was matching as the company name instead of just "Meta" โ the capitalisation check that's supposed to be the whole signal for "this is a proper noun" had quietly stopped checking anything. Rewrote it to keep the trigger phrase case-insensitive while keeping the company-name capture genuinely case-sensitive, then re-verified all six phrasings pull back clean, precise company names rather than trailing off into the rest of the sentence.
- Also ran two sentences with no company in them at all through it afterward specifically to confirm the fix didn't overcorrect into false positives, then reran both the original boring and maximum-cringe regression posts to confirm neither had moved.
Update 48
Utilities: A Floor For Tools, Not Games
- Cringeometer no longer has its own standalone hub slot. It's the first resident of a new floor, Utilities โ a supply-cupboard landing page for stand-alone diagnostic tools that don't need a full floor each, only a shelf. Deliberately built as a directory linking out to each tool's own existing page rather than merging their code together โ Cringeometer is a genuinely substantial, already-tested application in its own right, not a lightweight embedded mini-game, and folding its code into a shared page would have been real risk for no real benefit. Its file didn't move or change at all; only the front door did.
- A second tool card sits on the shelf already, marked "requisitioned" and locked โ Could This Have Been An Email?, paste a meeting invite, find out with evidence whether it needed to exist. Not built yet, deliberately โ noted as the confirmed next build rather than started half-finished.
- Three further ideas recorded for later rather than actioned now, so they don't get lost: a Performance Review Translator (paste the hedge-everything feedback from an actual review, get back what it plainly means), a Passive-Aggressive Email Detector (the same paste-and-score shape as Cringeometer, aimed at email instead of LinkedIn โ worth deciding on purpose whether that becomes its own tool or a mode inside one, rather than two tools quietly sharing a skeleton), and a Job Title Inflator (enter the real day-to-day, get it translated into deranged LinkedIn-title-speak โ generative rather than diagnostic, useful variety against three tools that are all "paste and get roasted").
- New floor got the same design rigor as everything else rather than a quick reskin โ its own palette (brushed steel, pegboard, hazard amber), checked proactively before anything else was built on top of it, which caught two real contrast failures in the first pass rather than after the fact. Full regression pass afterward across the hub: the new tile links correctly, the old direct link is genuinely gone rather than just hidden, the building directory reflects the swap with the row count still at sixteen, and achievement/day-night functionality untouched by any of it.
Update 49
Could This Have Been An Email? Is Live
- The second tool on the Utilities shelf, unlocked. Deliberately built as a form, not a textarea โ Cringeometer analyses freeform prose, but a meeting invite is structured data (title, agenda, duration, attendee count), and trying to parse that reliably out of arbitrary pasted invite text across Outlook, Google Calendar, and Slack's wildly different formats would have been fragile from day one. Title, agenda, duration, attendee count, a recurring toggle โ clean input in, no guessing what the text meant.
- Fourteen rules against real meeting-invite tells: no agenda, a title vague enough to describe any meeting ever held, "quick" doing work it can't back up, an agenda with information but no actual decision in it, attendee counts past the point of being a discussion, one-way status-update language that's just email with extra steps. The room-booking-panel visual isn't just a skin either โ an LED actually lights on the panel itself once a verdict lands, not only in the result card below it.
- The genuinely important test wasn't the worst-case meeting, it was the good one โ a five-person budget approval with a real agenda and an actual decision to make. Ran it through before trusting any of the egregious-case results: zero score, zero flags, no evidence card padded out with something to say. A detector that can't stay quiet about a meeting that earned its room isn't a detector, it's a slot machine.
- Built a genuine value-add on top of the diagnosis rather than stopping at the score โ where there's enough in the agenda field to work with, the tool drafts the actual email that could have gone out instead, subject line and all. Where the agenda was empty, the draft says so plainly rather than inventing content that was never there to invent.
- Checked contrast proactively again before anything got built on top of the palette, same as every tool before it โ caught one real failure in the first pass. Tested the egregious case and the justified case through the live UI, not just the isolated engine, confirmed the how-to modal and console easter egg both fire, then wired the Utilities card over from locked to live and updated its listing across all five languages to name both tools now living there rather than leaving it saying "currently housing The Cringeometer" once that stopped being true.
Update 50
The Performance Review Translator Is Live
- Third tool on the shelf. Different shape again on purpose โ this one is genuinely about decoding, not scoring, so the metaphor is a declassified document rather than a meter or an LED panel: paste the actual review, known euphemisms get a black bar over them with the plain-language translation revealed right next to it.
- Eighteen real HR phrases mapped to what they actually mean โ "needs to work on stakeholder management," "could benefit from more executive presence," "demonstrates growth opportunities," each translated plainly rather than left as a score with no explanation. Reused the annotation approach from Cringeometer's rewrite feature rather than the seamless-substitution approach that broke grammar there originally โ a lesson from one tool correctly carried into the next rather than re-learned the hard way twice.
- Caught a real, if minor, rendering bug in testing before calling it finished: the redacted phrase and its translation were rendering with no visible gap between them, reading as one run-on word. Fixed the spacing, then found the fix had overcorrected โ the translation now had a stray gap before whatever punctuation followed it in the original sentence. Fixed that too, then reread the actual rendered sentence rather than trusting the second fix by assumption.
- The full contrast checker caught two things this time, and only one of them was real. The "declassified" tab label failed against the redstamp background in dark mode โ genuine bug, fixed the same way as Cringeometer's earlier one, with a background colour that doesn't shift with the theme. The black-bar redaction itself also flagged as a 1:1 contrast failure, text colour matching its own background exactly โ correctly left alone, since that is not a bug, that is the entire mechanism of a redaction bar working as intended. Told the two apart by reading what each rule was actually for, not by treating every checker flag as equally urgent.
- The test that mattered most again wasn't the euphemism-heavy review, it was a genuinely specific, positive one โ concrete numbers, a real shipped feature, actual mentorship outcomes. Zero score, zero false flags. Wired into Utilities as Tool 03, and its listing updated across all five languages to name all three tools now living there.
Update 51
Per My Last Email, And A Design Question Actually Resolved
- Flagged a genuine open question before building this one rather than guessing: it shares Cringeometer's exact underlying shape, paste text, score it, show evidence, so building it blind risked this shelf turning into the same tool four times over with different targets. Asked directly whether it should be its own tool or a mode inside Cringeometer. Answer came back clear โ every tool stays under Utilities, distinct from the games, same shelf, same tone. Built accordingly, as its own fourth tool rather than folded into an existing one.
- Fourth visual identity, fourth genuinely different metaphor rather than a reskin of the first three โ office language already has the vocabulary for this one built in. An "icy" tone, a "chilly" reply, a "cold" email are all things people already say, so the tool is a thermometer, not another meter or redaction stamp. Named for the single most recognisable passive-aggressive email phrase there is, rather than a generic working title.
- Caught two real contrast failures before anything got built on top of them, and specifically caught a failure my own earlier fix introduced โ brightened the accent colour for text-on-card use in dark mode, then found that same brightened colour had broken the button that also relied on it for white text at 4.43:1. That second failure only surfaced because it got checked separately rather than assumed fixed once the first number looked right. Split into two dedicated variables so the button and the text-accent role stop fighting each other, the same pattern now applied three times across three different tools.
- One real gap found in testing, not assumed away: "not sure if my previous message made it to your inbox" didn't fire on the not-sure-if-you-saw-this rule, because the pattern expected a fixed short phrase immediately after "if," and real sentences put a variable noun phrase there instead. Widened it to allow that gap, reverified the fix against three real phrasings plus a genuine control sentence about the weather that correctly still doesn't match.
- Egregious email scored 88 with seven accurate hits. The same genuinely direct, professional email test that's now been run against every tool on this shelf came back clean again โ zero score, zero false flags. Wired in as Tool 04, listing updated across all five languages to name all four tools now living on the shelf.
Update 52
Chief Everything Officer, And The Utilities Shelf Is Full
- Fifth tool, and the last of the originally-brainstormed set. Different shape from the other four on purpose โ those four are all diagnostic, paste something real and get it scored or decoded. This one is generative: describe the actual day-to-day in plain words, get back a job title absurd enough to be real, with the plain truth restated underneath as the punchline. Fifth genuinely distinct visual identity too โ an engraved brass door plaque, since the genre being parodied is real C-suite title inflation (Chief Vibes Officer and its relatives), not another meter or panel.
- Found and fixed a real logic bug in testing, not a cosmetic one โ the title generator's core branching had both sides of a conditional doing the literal same thing, so "Chief" was never getting the "Officer" it needed and titles like "Chief Growth & Data Infrastructure" were shipping with a word missing. Restructured so each level properly carries whether it needs a trailing "Officer" or not, then generated sixty titles across every level to confirm all of them read as grammatically complete before trusting any single example.
- Also caught a real keyword-detection bug before it shipped: "I answer emails and update spreadsheets" was incorrectly tagging itself with Voice Channel Operations, because the keyword list had "answer" sitting there on its own, matching against email content that has nothing to do with phones. Narrowed it to the actual phrase, not the word in isolation, and reconfirmed the same input.
- Checked contrast proactively on every pairing before building anything on top of it, same discipline as all four tools before this one โ zero failures this time, the first tool on the shelf where that's been true from the first pass, likely because the brass-and-wood palette stays fixed rather than shifting per theme, so there was no variable being pulled in two directions to begin with.
- All five tools now live under Utilities, distinct from the games, same tone throughout: The Cringeometer, Could This Have Been An Email?, The Performance Review Translator, Per My Last Email, and Chief Everything Officer. Listing updated across all five languages to name the complete set rather than leaving it perpetually one tool behind what's actually there.
Update 53
A Parity Audit, Not An Assumption
- Asked directly whether the five tools were missing anything the rest of the building already has. Checked rather than assumed, and found two real gaps rather than zero โ worth being honest that "we built five tools with the same rigour" didn't automatically mean "we built five tools with full feature parity."
- Only one of the five tools had a working dark mode toggle at all. All five had the CSS variant built and tested, but four of them had no button and no function to actually reach it โ the only way night mode could apply was if it had already been set somewhere else on the site first. Genuinely broken for anyone landing on one of those four tools directly, which given they're meant to work as standalone links, is not an edge case.
- Found a real inconsistency while fixing it, not just the missing four: the one tool that did have a toggle was writing its preference to its own private key rather than the shared one the hub and the other four already read from. Fixed all five to write and read the same key, so dark mode is now a single, genuine site-wide preference rather than something that resets every time someone moves between floors.
- None of the five had a share feature at all, despite every mature game in the building having one. Added one to each, and made a point of writing five genuinely different share messages rather than one generic template with the tool name swapped in โ Cringeometer shares the score and its sharpest exhibit, the meeting detector shares the verdict and why, the review translator shares the euphemism next to its translation, the email detector shares the chill factor, and the title generator shares the absurd title next to the plain truth underneath it, since that contrast is the entire joke for that one.
- Tested both paths for every share button, not just the happy one โ the native share sheet where available, and the clipboard fallback specifically forced by removing navigator.share and confirming the actual clipboard contents afterward, since a fallback that's never been exercised is a fallback that's never actually been tested. Reran the core scoring and generation regression on all five tools afterward to confirm none of this disturbed what already worked, and reran the full contrast check across all five together โ zero new issues, only the same intentional black-bar exception from before.
Update 54
A Genuinely Bad Review That Scored Zero, Again
- Reported directly with the actual text โ a deliberately, extravagantly bad review, built almost entirely from invented and real corporate jargon (operationalizeability, solutioneering, granularizeable, bandwidth-allocation), scored a flat zero and got called "refreshingly blunt." Ran it through the engine before touching anything and confirmed it: zero hits, none of the eighteen specific euphemism phrases present anywhere in the text.
- Root cause, and it's a direct echo of the very first bug reported against this tool: the euphemism list only ever covered one register of corporate fog โ specific, common criticism phrasing like "needs to work on stakeholder management." It had no general jargon-density detection at all, unlike Cringeometer, which has always paired specific phrase-matching with a broader buzzword list. A review built almost entirely from generic buzzwords rather than any of the eighteen listed phrases was structurally invisible to it.
- Added two new density-based findings rather than trying to force this into the existing phrase-annotation system: a thirty-plus-word jargon list scored by count, and a separate structural check for stacked hyphenated compound nouns (human-capital-assets, macro-level-visioning), which don't need to be on any list to be caught since the pattern itself is the tell. Neither maps to a single clean position in the text the way a specific phrase does, so rather than force thirty scattered redaction bars into the existing inline view, gave them their own dedicated card. Reported text: zero to seventy, both findings genuinely specific to what was actually pasted.
- Didn't stop at the one tool that got reported. The same underlying weakness โ specific phrase-matching with no general fallback โ was worth checking for elsewhere before calling this done, so ran an adversarial version of the same test against the other diagnostic tools. Per My Last Email had the identical gap: a genuinely passive-aggressive email built from stacked softening phrases rather than any of its sixteen listed patterns also scored zero. Fixed with an analogous hedge-stacking check. The meeting detector held up reasonably on its own equivalent test, since it leans more on structural signals โ attendee counts, missing decisions โ than pure phrase matching, so it wasn't carrying the same weakness to begin with. Cringeometer scored the equivalent buzzword-salad case at a real but under-calibrated 12, not zero โ its buzzword list existed but was missing several of the exact words in the adversarial text; expanded it and raised an overly conservative internal cap that was silently capping the finding at 24 points regardless of how dense the buzzword use actually was.
- Caught two of my own mistakes while building these fixes, before either reached the user. Wrote the hedge-stacking rule to return a full object where the scoring code expected a plain string, which would have silently broken on the very first email it matched โ caught by testing the rule immediately after writing it rather than waiting until the batch was finished. Separately, a new multiplier on the Cringeometer fix produced a decimal score like "40.5" instead of a whole number, inconsistent with how every other score in the tool displays โ caught the same way, by testing right after the change instead of assuming a plausible-looking number was a correct one.
- One genuine discrepancy chased down rather than left unexplained: the fixed Cringeometer scored 41 when tested directly against the engine, but an early UI test read only 32 off the page. Rather than assume either number and move on, tested the engine call directly inside the browser โ 41 โ which ruled out the scoring logic and pointed at the UI instead. The actual cause was the test not waiting long enough for the score's own count-up animation to finish before reading the number off the page; a longer wait showed 41 consistently. Confirmed as a testing artifact, not a product bug, rather than leaving a discrepancy sitting in the record unresolved.
- Full regression pass across all three touched tools afterward: the original clean-review and clean-email test cases still score zero with no new false positives, the original heavy-cringe and egregious-email cases are unchanged, and the full contrast checker was rerun across all three together with zero new issues.
Update 55
Teacher Simulator Gets A Real Tease
- Turned out this didn't need building from scratch โ Teacher Simulator already existed as a locked "coming soon" floor at B4, complete with its own tease copy. Only the department line needed replacing: swapped the vague "Coming Eventually ยท Probably" for the specific "Back to School in September," matching the actual UK school calendar rather than a non-committal placeholder.
- Added as its own dedicated key rather than overwriting the generic one in place, so the original "coming eventually" phrasing stays available if a future locked floor needs it rather than being lost the moment this one changed. Confirmed the key wasn't shared with anything else first โ it wasn't, used exactly once per language โ so this was a safe, contained swap.
- Confirmed the tile is still genuinely non-clickable (a div, not a link) and correctly absent from the building directory, since there's nowhere to actually send someone yet. Language switching confirmed across all five.
Update 56
The Infirmary Opens, With Bay Watch As Its First Bay
- Standards pinned at the top of this log before any building started, not written up afterward to describe what happened to get done. One line in that pass turned out to be wrong on inspection rather than assumed correct: it claimed every game carries full five-language i18n. Checked across thirteen individual game pages before leaving that claim standing โ eleven of them are English-only, with the hub itself and two early games as the actual exceptions, not the pattern. Corrected the standards entry to say what's actually true rather than what sounded consistent, and built Bay Watch English-only to match the real pattern rather than the one that had just been wrongly written down.
- The Infirmary is live as its own floor, sixth on the hub, with a ward-directory board as its signature visual rather than a reskinned version of Utilities' pegboard or any existing floor. All five brainstormed bays listed on the board; four sit locked pending their own build, Bay Watch open as the first.
- Bay Watch's core loop: six bays call at random, a shrinking bar gives a few seconds to respond before a bay goes agitated and calls again sooner, while a medication round comes due on its own separate timer and competes for the same attention. Eighteen achievements, a share feature carrying the actual verdict and stats, full contrast checked proactively before anything got built on the palette.
- Found a genuine, significant bug in testing, not a cosmetic one: tapping a calling bay would frequently register as a miss even with several seconds still showing on its timer. Traced it properly rather than guessing โ instrumenting the click handler surfaced a null-state error, which led to checking what Playwright's own retry log was reporting: the bay element was being detached from the DOM and recreated, repeatedly, mid-click. The actual cause was that updating any single bay's state was re-rendering the entire six-bay grid from scratch every time, which happens constantly once bays are spawning and expiring independently of each other โ meaning a real tap could get pulled out from under a player's finger by a completely unrelated bay changing state at the same moment. Rebuilt the rendering so each bay is a stable, persistent element updated in place, touched only when its own state actually changes.
- Didn't stop at "the click eventually worked" once that fix landed โ a second, separate symptom remained where Playwright still wouldn't complete some clicks. Distinguished it properly rather than folding it into the same bug: a forced click that bypasses Playwright's own animation-stability heuristic worked immediately and correctly, which confirms that remaining friction was the pulsing CSS animation on calling bays tripping an automated-testing checker, not anything a real person tapping a real screen would ever encounter. Getting that distinction right mattered โ treating it as the same bug would have meant either shipping an unnecessary animation removal or wrongly declaring the real bug still open.
- Verified the fix under the condition that actually exposed the original bug, not just a simplified retest: forced a bay to call with a thirty-second window specifically to rule out any legitimate expiry, and confirmed score and answered count updated correctly with no detachment errors in the log. Then reran the original realistic version โ a naturally spawned call, discovered by polling rather than forced โ and got the same clean result.
- Verdict and achievement logic tested at both extremes by setting state directly and calling the end-of-shift function, rather than only trusting a single playthrough: a flawless-stat shift correctly produced the top verdict and eleven matching achievements with nothing extra unlocked, and a deliberately poor shift correctly produced the bottom verdict with exactly the three achievements that stat profile should trigger. Medication round completion and expiry both tested directly, each confirmed to move score and its own counters in the right direction without touching the other's numbers.
- Wired into the hub afterward: floor tile and building-directory entry added in all five languages, the shared achievement total updated to include Bay Watch's eighteen, and a full regression pass confirmed none of it disturbed the achievement modal, day-night toggle, or existing floor tiles.
Update 57
The Infirmary Is Complete โ All Five Bays Open
- Next Patient, Please, Terminal Clean, Ward 12, and 8AM Rush, built in sequence, each with its own genuinely distinct mechanic rather than a reskin of Bay Watch's juggling model: a single-relationship deadline with a hidden-complaint twist, an ordered protocol under external pressure, spatial grid navigation, and resource-constrained triage under call volume. Fifty-eight further achievements across the four, full contrast checked proactively on every one before anything got built on the palette, share features carrying genuinely different text per tool rather than one template with names swapped.
- Next Patient, Please: found a real logic bug the moment it was reasoned through rather than after testing exposed it โ a rule meant to reward genuinely investigating a hidden complaint was written so that guessing the right label without ever asking the follow-up question would still count as a catch. Tested both paths directly before trusting either: digging and picking correctly scored properly, picking the same correct label without digging first correctly still counted as a miss, confirming the rule rewards actually finding out, not landing on the right answer by chance. Also caught a repeated-firing bug identical in shape to Bay Watch's, different in mechanism โ a timeout check with no guard against re-firing during the delay before the next patient loaded, counting one missed appointment as twelve. Fixed with the same resolved-flag pattern, verified the fix produces exactly one increment, not many.
- Terminal Clean: caught a scoping bug in code review before it ever reached testing โ a contamination counter tracked per room rather than per step, meaning one missed door on step one would have silently marked every later step in that same room as contaminated too. Fixed before it shipped. A full real playthrough attempting to hold every door confirmed a genuinely clean run produces a genuinely clean verdict.
- Ward 12: the one built on a different technical foundation entirely โ grid navigation instead of a timer loop, which meant a different category of risk. Validated all four hand-designed maps with actual breadth-first search before writing a single line of game code, and the validator caught a real one immediately: a maze with no path from start to target at all, a puzzle nobody could ever have solved. Redesigned it, re-validated, then proved all four were genuinely playable โ not just theoretically solvable โ with a full auto-solver playthrough navigating each map's real shortest route from a live, randomly-selected session.
- 8AM Rush: the redirect category was written to match how real triage actually separates cases, not just to hit three roughly-even buckets โ chest pain with cardiac features goes to 999, not a same-day GP slot, and the caller data reflects that distinction on purpose. Tested the resource constraint directly, not just the individual triage calls: booking a case "today" when slots are visibly exhausted is blocked at both the interface, where the button disables, and the function itself, which rejects the action even when called directly โ confirmed both layers hold independently.
- All five roles were kept to recognisable physical and logistical scenarios throughout โ a policy decided once at the start of Next Patient, Please and then actually followed for the other three, rather than redecided per game. Nothing in any of the five ever touches mental health crisis content.
- Closed out the floor properly rather than leaving it half-finished in its own copy: The Infirmary's own about text and the hub's floor description both still said "starting with Bay Watch" once that stopped being true with four more bays live. Updated both, across all five languages on the hub side, rather than letting the building's own signage quietly fall behind what it actually contains.
- Full regression sweep across the whole floor to close out: structural validation and JS syntax on all seven touched files, the automated contrast checker run across the entire set together with zero issues, and a final confirmation that all five bay links resolve correctly with no locked cards remaining. Building-wide achievement total now four hundred and eleven.
Update 57
The Infirmary Is Complete โ Four More Bays, Four More Genuine Bugs Caught
- All five bays now open: Bay Watch, Next Patient Please, Terminal Clean, Ward 12, and 8AM Rush. Each one a genuinely different mechanical shape rather than the same loop reskinned five times โ simultaneous-demand juggling, a single relationship under a hard deadline, ordered protocol against external pressure, spatial grid navigation, and resource-constrained triage under volume. If any two of these would have looked interchangeable with the labels removed, that would have been the signal to go back and differentiate them properly. None did.
- Next Patient, Please โ a real bug found the same way as Bay Watch's, a different mechanism: the timeout-and-advance logic had no guard against firing on every 60ms tick during the delay before the next patient loaded, so a single timeout was incrementing the missed count twelve times over instead of once. Fixed with an explicit resolved-flag, reset only when the next patient actually arrives. Separately caught an achievement condition relying on a flag that could drift out of sync with the actual miss count โ made it check the real number directly instead of trusting a second piece of state to stay honest on its own.
- Terminal Clean โ caught a logic bug in review before it ever reached testing: the contamination tracker was scoped to the whole room rather than the specific step in progress, meaning one missed door on step one would have incorrectly marked every later step in that room as contaminated too. Fixed before it shipped. A brute-force test afterward showed rooms completed exceeding the session cap, which looked alarming until a properly sequential retest with generous waits confirmed the game logic was correct throughout โ the count only broke under a test loop calling faster than a real tap ever could, not under anything a player would actually do.
- Ward 12 โ the one built on a genuinely different technical shape, grid navigation instead of a timer loop, which meant a genuinely different risk: one of the four hand-designed maps turned out to have no valid path from start to target at all, an unsolvable puzzle that would have shipped straight to a player. Caught by validating every map with actual BFS pathfinding rather than trusting a hand-drawn maze looked connected by eye. Redesigned the broken one, re-validated it, and then ran a full autopilot playthrough using real shortest-path solving across all four maps to confirm they're not just theoretically solvable but genuinely playable end to end.
- 8AM Rush โ the triage categories built to match real primary-care logic rather than invented ones: genuine emergencies redirect to 999, pharmacy-level concerns redirect there instead of taking a GP slot, and only genuinely concerning-but-not-emergency symptoms get a same-day booking. Booking the wrong case today still spends the same scarce slot as booking the right one, which is the actual point โ the tension is a real resource constraint, not just a scorekeeping penalty. Full playthrough tested handling every category correctly, including the edge case of same-day slots running out entirely and needing to fall back on redirect for a case that genuinely warranted a slot.
- While finishing the floor, found and corrected a documentation error that predates any of this work: the "coming up" list on this page had been claiming Old MacDonald's and Front of House were still under construction, when both have been live floors on the hub for a long time. Left standing, that's the kind of stale note that quietly misleads whoever reads it next. Corrected to list only what's actually still locked.
- The Infirmary's own copy updated to match its real state too โ the floor description no longer says "starting with Bay Watch" now that starting was months ago in game-time and finishing is the truer description, in all five languages on the hub and in the floor's own about panel.
- Every game proactively contrast-checked before anything got built on its palette, each caught and fixed at least one real failure before it ever reached testing โ the same "one variable pulled in two directions across day and night" pattern recurring across all four, confirming it's a genuine, repeatable hazard worth watching for by default rather than a one-off. Full regression pass across the whole floor and the hub afterward: achievement total now 411, modal and day-night toggle both unaffected, all five bays confirmed live and linked correctly in the ward directory.
Update 58
Went Back Through The Infirmary For Humour And Bite โ Found A Real Gap, Not Just A Polish Pass
- Asked to check all five games for humour, chaos, savagery, and appropriate brutality. Read the actual current copy in each file before touching anything, rather than assuming the mechanics being sound meant the tone was too โ and it wasn't fully sound. Every achievement across all five games had a name and nothing else: no punchline, no flavour text, just a locked-or-unlocked label. Checked an established game on another floor for comparison and confirmed every one of its achievements pairs a name with a specific, dry one-liner explaining what actually happened. That entire second layer of personality was missing here, across all five games at once โ not a style choice, an omission.
- Bay Watch turned out to have no in-the-moment feedback at all: the HUD numbers updated silently and the only actual commentary lived on the end screen. Nothing acknowledged a bell answered or a bell missed while the shift was still running. Built the entire toast feedback layer from scratch for that one game specifically, including a night-mode colour that failed the same contrast test already fixed in three of the later games โ caught and corrected before it was used for anything, rather than reintroducing a bug already solved elsewhere in the same project.
- Rewrote all eighty-plus achievements across the five games with a real description on every one, and caught a genuine bug in the process rather than after: the very first achievement in Bay Watch's rewritten list quietly lost its description when a block edit didn't reach as far back as it needed to, and the modal rendered the literal word "undefined" as its flavour text. Found by testing the actual rendered output rather than trusting the array looked complete, then swept every remaining game with a direct check โ filter every achievement for a missing desc field โ rather than re-reading each list by eye and hoping nothing else had slipped through. Nothing had, once the one that had was fixed.
- Sharpened the toast copy in the four games that already had it, since "correctly handled" and "not the right call" were functionally accurate and completely flat โ replaced with small pools of specific, varied lines per event so the same outcome doesn't read identically on the third playthrough as it did on the first. 8AM Rush's toasts rebuilt as name-aware templates so the feedback names the actual caller rather than reporting a generic outcome. Ward 12's "stopped for directions" interruption had no feedback message at all before this pass; it does now.
- Retested every touched game after the rewrite, not just the copy in isolation: achievement modal rendering confirmed with real descriptions showing for real unlocked entries, every toast event fired and read back in the browser rather than assumed from the source, and the full contrast checker rerun across all five with zero issues. The gap here wasn't a missing coat of polish on otherwise-finished work โ it was a whole layer of the house style that got built into every other floor in this project and didn't make it into this one on the first pass. Worth naming plainly rather than folding quietly into "some tone adjustments."
Update 59
Bay Watch Gets A Penalty For Wrong Presses And Genuinely Endless Levels
- Two requests: pressing a bay that isn't calling should cost something instead of being a free no-op, and the single 75-second shift should become a run of discrete, harder-each-time levels with no fixed ceiling.
- Wrong presses now cost points and get tracked separately from missed calls, with their own toast line naming the actual bay. Small addition, but it changes the character of the game slightly โ tapping every bay on instinct is no longer free, so precision actually matters.
- Replaced the single fixed-duration shift with forty-second levels that get harder on every clear โ ring windows shrink, calls come faster, medication rounds tighten, all sliding toward a floor rather than a hard level cap, so the run can continue indefinitely without ever becoming literally unplayable. Verified the escalation is real and substantial by reading the actual difficulty numbers back at levels 1, 5, 9, 15, 20, 30, and 50 rather than trusting the formula looked right on paper โ level 1 matches the old baseline exactly, and the numbers hit their floor around level 25-30 and hold there, which is the "insane but not broken" territory that was asked for.
- The lose condition is now structural rather than a timer running out: if all six bays are agitated at once, the ward has genuinely gone to chaos and the run ends there. That single condition scales naturally with the difficulty curve instead of needing a separate score threshold bolted on. Added a voluntary "clock out" option alongside it, since an endless format with no exit would otherwise force anyone who wanted to bank a good score to keep playing until they lost it.
- The old "Flawless" achievement required zero misses across an entire shift, which becomes structurally impossible once losing requires having missed enough to agitate all six bays โ a genuine design conflict caught by thinking through the new rules before writing achievement code, not after. Redefined it to per-level perfection, which fits an endless format better anyway, and added a separate, harder "Untouchable" for zero misses across the whole run through at least level five, so the original whole-run-clean concept still exists as a rarer, distinct achievement rather than being quietly dropped.
- Caught a real bug in testing: the level number incremented correctly in the underlying state on every level-up, confirmed directly, but the on-screen badge never moved because the level-up function never called the HUD update. Internally correct, visibly broken โ the kind of bug that's easy to miss because everything looks fine until you specifically check what the player would actually see change. Fixed by adding the missing update call, then reconfirmed the badge moves on a real level-up before moving on.
- Miscounted the achievement list by two while planning it in my head โ wrote twenty-nine entries while thinking of it as twenty-seven. Caught by counting the actual array length directly rather than trusting the mental tally, and checked for accidental duplicate ids at the same time while already looking. None existed; the count itself was just wrong. Used the verified number, not the remembered one, when updating the building-wide achievement total.
- Full regression pass: wrong-press penalty confirmed to only fire on non-calling bays and never disturb a correct response, the lose condition confirmed against a forced all-six-agitated state, a full realistic playthrough run with genuine timed responses produced no errors, and the contrast checker rerun clean except for the one already-verified false positive from a CSS specificity override the checker script doesn't fully resolve. Building-wide achievement total now 422.
Update 60
Terminal Clean Gets A Real Decision Layer, And Every Game Learns To Undermine A Win
- Told Terminal Clean was linear with no real purpose to its mechanics. Read the actual current file before assuming what needed building, rather than working from memory of what was originally shipped โ and it turned out the room-selection and per-room-deadline system was already in place, genuinely giving real prioritisation under competing clocks. What was still missing was a second layer: once a room was selected, completing a step was a single tap with no decision behind it at all.
- Added that missing layer rather than rebuilding what already worked: every step now offers Quick (instant, real chance of getting flagged) or Thorough (guaranteed clean, but takes a moment that the room's clock and the door-interrupt window don't pause for). Confirmed the interaction between the two systems directly rather than assuming it would just work โ a door interrupt firing mid-Thorough correctly contaminates the step despite the careful choice, and switching to a different room while a Thorough clean is still running lets it finish on its own in the background, which turned out to be a legitimate strategic option rather than a bug once tested through.
- Caught a tonal mismatch in testing: a Thorough clean interrupted by a door was using the same toast pool as rushing a Quick clean and getting caught, which told the player they'd cut a corner they hadn't cut. Gave the door-interrupted-while-careful case its own dedicated line instead of reusing the wrong one.
- Found the achievement total on the hub had already drifted stale before this update even started โ sitting at fourteen when the file actually had fifteen, from the earlier multi-room work never getting reflected back to the hub. Verified the true count directly rather than trust either the old hub number or a mental tally, added four new achievements for the quick/thorough mechanic, and updated the hub to the confirmed total of nineteen.
- Separately asked for every game's win state to put the player down or gaslight them rather than congratulate them straight. Applied to the top verdict tier specifically across all five games, each with two or three variants picked at random so a repeat top-tier finish doesn't read identically every time. Kept the tone consistent with the house style already established at the bottom tier โ the achievement itself stays real, only the framing turns on you: Bay Watch's best outcome now insists this is "apparently just the job now," Next Patient, Please's warns the standard will be quietly moved to match, Terminal Clean's calls a spotless ten-room shift "the basics," Ward 12's turns a record pace into a new permanent expectation, and 8AM Rush's has the practice manager treat a flawless morning as nothing more than plan being followed.
- Full regression sweep to close out: structural and JS validation on all five touched files, the contrast checker rerun with zero new issues, and each gaslighting line spot-tested by forcing a genuine top-tier finish and reading the actual rendered text back rather than trusting the pool array looked right on paper.
Update 61
Ward 12's Maze Now Grows, Gets Genuinely More Tangled, And Hides Things
- Asked for the maze to get bigger and more complex with each level, plus hazards and blocks that stay unseen until encountered. The four hand-designed maps this game shipped with couldn't scale to that on their own โ needed real procedural generation instead of more hand-authored layouts.
- Built a randomized-DFS maze generator, which guarantees full connectivity by construction rather than by luck, and still validated it properly rather than trusting the theory: 210 generations across seven sizes and thirty seeds each in isolation before it touched the game at all, then a further 75 generations through the actual live game code โ including the elevator and hazard placement layered on top of the base maze โ all checked with breadth-first search. Zero failures either time. Added a braiding pass afterward to open up extra loops rather than leaving a pure single-path tree everywhere, and re-ran the same validation after braiding to confirm it only adds passages and never breaks connectivity.
- Maze size and hazard count now scale with level and are capped for the actual screen they render on, not left to grow indefinitely into something a phone can't display โ cell size shrinks step by step as the grid grows so a thirteen-column maze still fits a mobile viewport, verified by reading the actual computed cell width back at several levels rather than assuming the formula was right.
- Hazards are placed on the maze but rendered as ordinary corridor until the porter is standing next to one, at which point it reveals itself โ a wet floor that costs a forced pause, or a trolley jam that blocks the tile outright until it clears on its own. Tested both directly: the wet floor correctly blocks movement for its full pause and clears after, and the trolley is confirmed unclickable while active and walkable again the moment its timer passes, checked at both the rendering layer and by calling the movement function directly to confirm it's rejected at the source, not just hidden in the interface.
- Two apparent failures came up during testing that turned out to be gaps in the test itself, not the game, and both were run down properly rather than either assumed a bug or waved away. An auto-solver playthrough seemed to stall mid-level โ the solver was following a path computed once at the start and had no idea a trolley had since blocked a step of it, so it kept attempting a rejected move instead of rerouting. A second playthrough showed the level number freezing after the very first delivery โ the test loop was reading position and target immediately after a delivery completed, before the game's own six-hundred-and-fifty millisecond transition had actually loaded the next maze, so it was comparing a completed delivery's stale coordinates against itself. Rebuilt the solver to recompute its route around live hazard state and to wait for the actual delivery count to change rather than trust position alone, and a full six-delivery run then advanced the level correctly every single time, with genuine hazard encounters along the way.
- Reused the level badge, clock-out button, and level-up banner pattern from Bay Watch rather than inventing a parallel version, and reused the same night-mode contrast fix pattern too โ checked this file's palette directly rather than assuming the earlier fix carried over automatically, confirmed the same specificity-override false positive shows up here in the automated checker, and verified the actual rendered colour in a live browser rather than taking the checker's word for it either way.
- Achievement total for this game had also drifted stale on the hub, sitting at fourteen against a verified live count of nineteen. Corrected to the confirmed number rather than the old one. Building-wide total now 432.
Update 62
A Confirmation Step Before Leaving Mid-Run โ Starting With The Infirmary
- Asked for a confirmation prompt before any reset, new-run, or exit action that could accidentally end an active game, since the small topbar exit icon sits right next to other frequently-tapped buttons and a mis-tap costs an entire run with zero warning โ worse now that Bay Watch and Ward 12 are endless and a lost run could represent real accumulated progress.
- Built and fully tested the pattern on Bay Watch first, since it exercises both cases at once: the exit link and the Clock Out button. A small two-button modal โ Stay or Leave Anyway โ only appears while a run is actually active; on the start or end screen, both actions work immediately with no interruption, confirmed directly rather than assumed. Verified the exit link's navigation attempt was genuine, not just a modal appearing for show, by watching the browser's actual frame-navigation events rather than trusting the URL alone, since testing over a local file with no server produces an error page on any real navigation attempt โ confirmed that error page was the result of a real navigation, not evidence the guard silently did nothing.
- Applied the same pattern to Next Patient, Please, Terminal Clean, Ward 12, and 8AM Rush, each using that game's own running-state variable rather than a shared one, and each tested the same way: confirm no active game means no prompt, confirm an active game shows it, confirm Stay genuinely cancels, confirm Leave Anyway genuinely proceeds. Ward 12's Clock Out button now carries the same guard as Bay Watch's.
- Checked before assuming the same approach would work everywhere else in the building: three of the older games โ IT Support, Payroll, Corporate Buzzword โ already carry their own exit handling for when the page is embedded in an iframe, entirely unrelated to this guard. That existing behaviour needs to be preserved and wrapped, not replaced, once this reaches those files. The remaining games each use a genuinely different state architecture from each other and from the Infirmary floor โ Lift Button in particular has no timed "run" at all, more a persistent stage-by-stage clicker where only theme, sound, and achievements survive a reload, meaning what "active" even means has to be worked out per game rather than assumed from one shared pattern.
- Five games complete and verified. Fifteen more remain, each needing its own short investigation before the guard can be added correctly rather than copied blind โ continuing through them next.
Update 63
Every Tool Rebuilt As The Software It Satirises
- Established a harder standard than the one already in place: it is not enough for each tool to have its own colours and texture, it has to structurally imitate the actual category of software it is making fun of. A recoloured card stack with a different accent is not a pastiche, it is a reskin, and eight of the amenity pages were exactly that.
- Rebuilt all eight from the layout up. The Learning portal is now a learning management system with a compliance bar that never reaches 100% and courses listed by reference code. Meet the Building is a facilities asset register, monospaced, with a SQL query in the header and undiscovered entries shown as genuinely redacted black bars rather than question marks. The Meeting Cost Calculator reads as an internal recharge document with a cost centre, itemised ledger lines and an authorisation block signed "Not Authorised". The Quiz is an occupational psychometric assessment with a candidate reference and a validity field reading UNVERIFIED. The Mission Statement Generator is a brand asset manager with a live buzzword-density readout and a Meaning field permanently at 0.00. The Executive Dashboard gained proper BI chrome โ saved views, dimension pickers, per-tile menus. The Advent Calendar became a facilities release schedule with items marked RELEASED, AVAILABLE or EMBARGO.
- Verified every one end to end rather than by eye: course completion and the real LinkedIn credential URL, register filters, currency conversion maths, quiz scoring, the dashboard morale slider, and December date simulation for the release schedule. Confirmed zero horizontal overflow on mobile across all eight.
Update 64
Contact Centre Simulator โ The Shift That Does Not End
- Floor 1d opens. Built as an agent desktop: persistent state selector with a timer that starts the moment you change it, queue depth and longest-wait climbing in your peripheral vision, softphone row, screen-pop customer record, wrap-up codes. Four metrics that fight each other by design โ rush the call and satisfaction drops, do it properly and handle time turns red, take a breath between calls and adherence slips.
- The specifics are the point: the next call arriving before you have finished typing notes on the last one, a disposition code list where none of them fit and "Other" is quietly recoded, transfer bouncing back from a closed queue, and team leader messages sliding in mid-call asking for a quick chat after this one.
- Structurally, the shift ends at five and then does not. Each scorecard is followed by a reason to stay and the finish time slides later. There is no real ending on the phones. There is a way out, it is available in an obvious place, and it is never once mentioned โ because that is exactly how it works.
- Target throughout is the metrics culture and the system, never the customer and never the agent. Customers are recognisably human; the scorecard is the villain.
Update 65
Schedule 1 โ Filed Where Nobody Reads
- Added a section to the bottom of the privacy policy, below every legal section and clearly separated from them, on the reasoning that it is the one page on any website that exists to be available and never read โ which makes it the correct place to keep things.
- Seven clauses pointing obliquely at things hidden around the building. Deliberately not instructions. Anyone who reads carefully gets a nudge; anyone who scrolls to the bottom gets nothing.
- Every genuine disclosure above it left exactly as it was. The page still does its actual job properly, which was the constraint the whole time.
- A placeholder clause for a future floor sits at the end, marked "Not Yet In Force" with a commencement date to be appointed. Putting a game about the law inside a legal document is an extremely stupid idea and it is going in anyway.
Update 66
The Stairwell
- The stairwell in the basement goes further than the directory does. What is down there is a full turn-based RPG, built to be played rather than glanced at โ character creation, levelling, equipment, a shop economy, side work, bosses, and a long way down.
- Deliberately no detail here about what is in it. Existence is worth knowing. Contents are not being written down, in the log or anywhere else on the site, and the achievement descriptions are oblique on purpose.
- Runs entirely on the device. No account, no sign-in, and no server checking whether you are still engaged. Add the building to a home screen and it plays on a train, in a lift, in a basement with no signal โ which is more than can be said for most things that ask for an account first.
- Access is behind one thing, and there are clues to it running in the daily notice and the gossip ticker. Anyone who has spoken to a certain long-standing resident of the lower floors will find the stairs are already in the directory.
Update 67
Measuring Before Changing
- Rather than guessing at balance, measured it. That exposed a genuine fault: the experience curve was shaped so that the fastest route was to skip everything and grind the deepest available content, which is exactly backwards and would have made the intended length meaningless.
- Rebalanced properly โ a longer curve, flatter scaling with depth, and a level-difference modifier so that farming things far beneath you pays close to nothing. Verified the numbers afterwards rather than assuming the fix worked.
- Also caught and fixed, in the same sweep: an achievement the game awarded but which had never been registered, meaning finishing recorded nothing at all; a floor mid-sequence with no downward stairs that would have stranded a player with no explanation; and a boss placed inside a room specifically designed to have no encounters in it.
- Difficulty is now derived from a floor's depth rather than set by hand, so anything added later scales correctly without re-tuning everything beneath it. Saves carry a migration layer, tested against deliberately broken and out-of-date save data, so future additions cannot break a run in progress.
Coming Up
Under Construction
- Teacher Simulator โ mark the books, cover the class, survive the staff meeting. Sub-basement 4. Access currently restricted. Tease copy: "Back to School in September."
- Solicitor Simulator โ a future floor, to be accessed from inside the privacy policy and nowhere else. The clause is already filed. It shall come into force on such day as the Management may by notice appoint. The Management has not appointed a day.
- The stairwell continues. More is going down there. Nothing further will be said about it here.