Episode
Gates that checked nothing, an addon shop, and named dungeons
Thursday's work started with a release that never ran because the safety check guarding it had crashed on its way to looking for problems, and a second check that had been passing without reading anything since the seventeenth. The team then spent the morning locking down what a community addon is allowed to do on your machine and the afternoon building and deploying a store to share them. Also shipped: one search across everything your account owns anywhere in the world, custom names on player dungeons, the last of the tooltips rebuilt, and about fifty tracker bugs including a golem that could dispel your sneaking.
In this episode
- Two build gates reporting green while checking nothing
- The addon sandbox in the morning, the addon store by evening
- Name your own dungeon, and be known for it
- One search across every chest you own
- The tooltip cluster finished, and the tooltips that leaked
Transcript
Good evening, citizens of New Britannia. Lord British before thee, with an accounting of what thy makers were about on Thursday. The lords and ladies of this realm may now set their own names upon their dungeons and their cellars, and be known for them. One word, typed into one window, will find any object thou ownest in any chest in any town. A market for community-made additions to the game stands open and guarded. And the machine that watches over our nightly release reported that all was well while it was, in point of fact, reading nothing whatsoever. We begin there, because it is the best story.
So. Wednesday night, the release to the test server did not happen. It started, it ran for fourteen seconds, and it stopped. My first thought was that somebody had broken something enormous, because fourteen seconds is not enough time to fail at anything interesting. The game code was fine. All of it. The thing that stopped the release was the safety check that runs before every release, and it had not found a problem. It had fallen over on its way to looking for one. And the same check, running on a different machine, was reporting a clear green all night long.
Here is what that check does. We have a rule in the server code that a new file has to be registered in two separate lists, and if you register it in one and forget the other, the file compiles perfectly and then is simply absent from the build that actually runs. It is a nasty class of mistake, so we wrote a checker for it. That checker looks for a particular build tool on the machine, and when the tool is not there it is supposed to shrug and fall back to its own simpler method. Earlier in the week somebody tightened the script's language settings, which is normally a fine and virtuous thing to do. Under the tighter rules, reading a value that does not exist stopped being a harmless nothing and became a hard stop. So on every machine without that tool, the checker died on the first line, and the release path died with it. On the one machine that does have the tool, the checker sailed straight past the broken line and reported green, every night.
Then, an hour later, we found the second one. There is another copy of that same check that runs on every push, and it was passing everything. It was passing everything because it was running the checker out of the build machine's own working copy, and that copy had not been refreshed since the seventeenth of July. It predated the fix that lets the check run without that build tool. So it hit the old code path, skipped, and returned success, having evaluated precisely zero of the things it exists to evaluate. That job now takes the checker from the code being pushed, so an out-of-date machine cannot turn a gate into a decoration. And I will quote the engineer directly, because they put it better than I would: a gate that goes green while checking nothing is worse than no gate at all.
We had two guards on the door. One of them had been asleep since the seventeenth, and the other one was standing in a completely different building, watching a different door, reporting with total honesty that nothing suspicious was coming through it.
It was that kind of day for our tools, so let me finish the thought. The little helper that every one of our sessions uses to commit work had a flaw where handing it several files at once committed the first one and absorbed the rest into the message. It had done that three times that morning before the pattern became obvious. It now refuses the ambiguous form outright. The nightly automated test run had been reporting failures since Monday, and the cause was eight new tests that need a real graphics device to run at all, on a runner that had been started without one. And in the middle of building a new tutorial step, an editor that had gotten itself stuck flushed a queue of old save requests and rewrote our entire opening scene, dropping it from thirty-four megabytes to fourteen and removing a couple of thousand objects that nobody had asked it to remove. That rewrite was riding along inside a feature commit, bound for every new player on that night's build. It was caught, the scene was restored to its known-good state, and only the reviewed change went in, a fifty-seven line insertion, verified by hand.
Now. Let me tell you about the shape of Thursday afternoon, because the order matters. In the morning, the team put our addon system in a sandbox. Addons are player-written scripts, they have been part of this game for years, and they are wonderful. They are also, if you are being honest about it, a stranger's program that you downloaded and gave the full run of your machine. An addon could read and write anywhere on your disk. It could launch other programs. It could sit in an endless loop and take the whole client down with it. We shipped that for years and, largely, everyone behaved.
That is over. An addon's file access is now confined to the addon folder. Launching programs is blocked. There is a watchdog that stops a runaway script, and the watchdog was built so that a misbehaving addon cannot catch and swallow its own execution, which is a detail I quite enjoy. A new addon that appears in your folder now installs turned off, with a line in chat telling you it arrived, and it does not run until you say so. Every addon error in chat now begins with the name of the addon at fault, and an addon that keeps throwing errors turns itself off. And because scripts were writing files by hand purely to remember your settings, there is now a proper way to save settings between sessions, per character or per account.
And then, with all of that in place, the team spent the afternoon building the thing that becomes possible once installing an addon is safe. A community addon store. A package format with strict validation. A service with an author sign-in that uses your game account. A public catalog. An admin review console. An in-game window with browse, install, update and remove, and a submit flow you can drive from inside the game. That is roughly four hours from the first commit to a running, deployed, tested service, and I have been doing this long enough to find that startling.
The part I like best is the reviewer. Every submitted addon is read by an AI reviewer before a human ever sees it. It writes a plain one-paragraph description of what the addon does, for the store page, and a detailed technical report for us. It flags risky patterns. And on anything it does not consider obviously safe, it takes a second, deliberately skeptical pass. Nothing appears in the store until a person on our side approves it, and anything you install arrives turned off until you enable it.
Which is to say, four independent things now stand between you and a bad addon, and the last one of them is you.
I do want to be clear about the sequence of events, though. We spent the morning making certain that an addon cannot rifle through your hard drive, and then we spent the afternoon opening a shop to hand them out. In that order. Very deliberately in that order.
Next. You may now name your dungeon. If you own a lot with a basement or a player dungeon, you go to the entrance, open the options, and give the place a name of up to fifty characters. Everyone who walks up to that entrance sees the name you chose, paired with your name as the owner, always, plus a marker if you have open combat switched on down there.
There is something proper about that pairing, and it was a deliberate piece of design rather than a nicety. The custom name never replaces the true one. You may call your cellar the Vault of Endless Sorrows, and the entrance will cheerfully report that the Vault of Endless Sorrows belongs to you. The name cannot imitate a real place in the world, and it cannot be shaped to forge a line in our records, because the character rules forbid the punctuation that would let it. A man who digs a hole beneath his house and fills it with monsters has earned the right to put a name on the door. He has not earned the right to sign somebody else's.
There is a real benefit underneath the vanity, too. Kill records and location records from inside a player dungeon now carry the dungeon's name, its owner and its plot, so our statistics can finally tell one player's dungeon from another's, where before every one of them was just a player dungeon. Addons can ask for the current dungeon's name and owner as well. And the follow-up commit, twenty minutes later, fixed the small indignity where the rename box allowed fifty characters and let you type thirty. So the very first people to name a dungeon got about two thirds of a name.
Now here is the one I think most of you will actually use. Search All My Stuff. It came out of the wishlist, request eleven-oh-four, and it does exactly what the name promises. You type a few letters, you press Enter, and the game searches everything your account owns. The inventory of every character. Your bank in every town. Mail attachments. Chests on your lots in scenes you have not set foot in for a year. Storage crates, crafting stations, your vendor listings, your ransom holdings. Every result tells you the quantity, the place, and the name of the actual chest or pouch the thing is sitting in. If it is on your lot in the scene you are standing in, there is a button to mark it on your compass. If it is somewhere else, the row tells you where to travel.
You open it from the window selector, or by typing findmystuff in chat, or with a hotkey you can bind yourself. Underneath, it is one indexed pass over every container the account owns, capped, rate limited, and streamed back in pages so nothing hangs. The team measured it against the largest hoard on the test shard before shipping it. One thousand four hundred and eighteen containers. A hundred and thirty-nine thousand items. Thirty-eight milliseconds.
A hundred and thirty-nine thousand items. I would like to salute whoever owns that account, sincerely. That is not an inventory. That is a civic institution. This one rides the next test build, and I suspect a number of you are about to discover exactly where you left something.
The last of the tooltips came over to the new interface as well, which finished a piece of work that has been running for weeks. Item tooltips, skill tooltips, place tooltips, the side-by-side equipment comparison, storage slots, the training-mode badge. All rebuilt, and then the old tooltip rendering system and its prefabs were deleted outright, which took about fifteen thousand lines of code out of the client in a single stroke.
It did not go perfectly, and testers caught it with screenshots the same morning. Hover an item in your bag, and you might see the complete tooltip for the last skill you cast stacked underneath it. Or the name of the last decoration you picked up, floating above the item's name. Or a piece of sheet music you had glanced at. The tooltip host was letting go of the old view without hiding it, so the next tooltip drew right on top of the previous tenant. You would hover a fish and receive a lecture about Chaos Bolt. Fixed, with regression tests, within a few hours of the report.
The other tooltip repair is the one you may have been squinting at for a while. Our older interface encodes colored text with bracket codes, and two of those codes were unknown to the translator that carries text into the new interface, so instead of coloring anything they printed themselves. Buff tooltips were the worst of it, reading like a bracket, a bracket, plus three, a closing bracket, Health, another closing bracket. The translator now understands every code the old interface can emit, and the conversion happens in the shared plumbing, so window titles and list rows get it without anyone wiring each window by hand. Fifty-three automated checks hold it in place. And while we were in there, raw materials that have no crafting bonus stopped displaying an empty Material Crafting Bonus heading with nothing under it. That was mostly fish.
A handful of smaller things that will improve somebody's evening. If you sneak for a living, a golem's magic cancellation will no longer strip Silent Movement and Shadow Form off you. Those two stealth skills were carrying a leftover Moon magic tag from years ago, so every mechanic that cancels the nine schools of magic was catching them, and a golem could dispel your sneaking. Friendly spells now land on your own pet when your pet is the thing you have targeted, instead of jumping to a party member standing nearby.
Your ears get a good day too. Liches now sound dead. They were being cast from the plain human voice catalog with no treatment on top, so the great undead sorcerer greeted you like a healthy man in his forties, and the remaining plain skeletons had the same gap. All of them moved to the deep rasping undead treatment and the whole voice set was regenerated, nine thousand two hundred clips, live on your next login with no patch to download. Blink, Summon Skeleton and Reveal Hidden now make a sound when you cast them, having had no audio authored on them at all, and two of the three had recorded clips sitting in the library that were never connected to anything. Savage Sonata finally shows its song ring.
Out in the world, the observatory telescope no longer includes its own tube in the magnified view, which is the sort of bug you can only fix once you stop laughing. Towns with a salt or fetid fishing statue had lost the depth readout, and the depth-based quality of your trophy fish, on all of their real water, because the statue was overriding rather more than the water type. And distant creatures have stopped bouncing, freezing every three seconds and sliding along with their legs locked, which was three separate defects wearing one costume.
Around your house and your belongings, the tax countdown on a newly claimed taxed lot now ticks from the moment you claim it rather than sitting frozen for a day. The solid wood and metal basement doors respond to a click again, after their interactive piece and their clickable piece spent some time wired to different places. Right-clicking Repair on an artifact now reaches for the ancient essence in your bag instead of trying an ordinary repair kit, failing, and giving up while the essence sat there. And a loot attempt that gets blocked by party rules or by another party's claim now tells you so in plain words rather than doing nothing at all.
Beyond that, twenty-three tracker issues closed on Thursday, and about fifty separate fixes landed across the day. A launcher update went out for both platforms carrying crash-reporting repairs, and the triage behind it confirmed the farming crash from the previous test build is dead: one thousand two hundred and forty-eight of those errors on the server the day before the fix, and zero since. We also stopped every uploaded crash log from ending in dozens of font errors generated during shutdown, which is the sort of noise that hides real problems in plain sight.
The rest is a pile of small mercies. Eighteen interface strings that a translation sweep had swallowed are restored, with a keep list so it cannot happen again. Players on slower machines will stop being thrown to the title screen during heavy scene loads, since the patience on both ends went from thirty seconds to ninety and beyond. Deleting a character can no longer cost you a slot forever, which it could, once, in a way I will describe only as a character that had a name and no body and ate a slot on the way out. Skarde in Spindelskog will now mention that bag of runestones instead of waiting for you to type the exact phrase he had in mind. Obsidian Chainmail accepts patterns in all five slots. And threshing wheat no longer makes it heavier, which it did, for years, in defiance of agriculture.
That is Thursday. I am looking forward to two things in particular. The in-game addon window arrives with the next client build, and I want to see what the community does when sharing an addon takes thirty seconds instead of a forum post. And I want to see what you name your dungeons. Be inventive. Be kind. Remember your name is on it as well.
And one last thing. I asked our audio people why it took most of an evening to make the liches sound properly dead. Apparently the hard part is the recording session. When you book a skeleton, there is nobody in the booth. Good night, friends.