Ten-Year Moziversary

I’m a few days late publishing this, but this October marks the tenth anniversary of my first day working at Mozilla. I’m on my third hardware refresh (a Dell XPS which I can’t recommend), still just my third CEO, and now 68 reorgs in.

For something as momentous as breaking into two-digit territory, there’s not really much that’s different from last year. I’m still trying to get Firefox Desktop to use Glean instead of Legacy Telemetry and I’m still not blogging nearly as much as I’d like. Though, I did get promoted earlier this year. I am now a Senior Staff Software Engineer, which means I’m continuing on the journey of doing fewer things myself and instead empowering other people to do things.

As for predictions, I was spot on about FOG Migration actually taking off a little — in fact, quite a lot. All data collection in Firefox Desktop now either passes through Glean to get to Legacy Telemetry, has Glean mirroring alongside it, or has been removed. This is in large part thanks to a big help from Florian Quèze and his willingness to stop asking when we could start and just migrate the codebase. Now we’re working on moving the business data calculations onto Glean-sent data, and getting individual teams to change over too. If you’re reading this and were looking for an excuse to remove Legacy Telemetry from your component, this is your excuse.

My prediction that there’d be an All Hands was wrong. Mozilla Leadership has decided that the US is neither a place they want to force people to travel to nor is it a place they want to force people to travel out of (and then need to attempt to return to) in the current political climate. This means that business gatherings of any size are… complicated. Some teams have had simultaneous summits in cities both within and without the US. Some teams have had one or the other side call in virtually from their usual places of work. And our team… well, we’ve not gathered at all. Which is a bummer, since we’ve had a few shuffles in the ranks and it’d be good to get us all in one place. (I will be in Toronto with some fellow senior Data Engineering folks before the end of the year, but that’s the extent of work travel.) I’m broadly in favour of removing the requirement and expectation of travel over the US border — too many people have been disappeared in too many ways. We don’t want to make anyone feel as though they have to risk it. But it seems as though we’re also leaning away from allowing people to risk it if they want to, which is a level of paternalism that I didn’t want to see.

I did have one piece of “work” travel in that I attended CSV Conf in Bologna, Italy. Finally spent my Professional Development budget, and wow what a great investment. I learned so much and had a great time, and that was despite the heat and humidity (goodness, Italy. I was in your North (ish). In September. Why you gotta 30degC me like this?). I’m on the lookout for other great conferences to attend in 2026, so if you know any, get in touch.

My prediction that I’d still be three CEOs in because the search for a new one wouldn’t have completed by now: spot on. Ditto on executing my hardware refresh, though I’m still using a personal monitor at work. I should do something about that.

My prediction that we’d stop putting AI in everything has partially come true. There’s been a noticeable shift away from “Put genAI in it and find a problem for it to (maybe) solve” towards “If you find a problem that genAI can help with, give it a try.” You wouldn’t notice it, necessarily, looking at feature announcements for Firefox, as quite a lot of the integration infrastructure all landed in the past couple of months, making headlines. My feelings on LLMs and genAI have gained layers and nuance since last year. They’re still plagiarism machines that are illegally built by the absolute worst people in ways that worsen the climate catastrophe and entrench existing inequalities. But now they’ve apparently become actually useful in some ways. I’ve read reports from very senior developers about use cases that LLMs have been able to assist with. They are narrow use cases — you must only use it to work on components you understand well, you must only use it on tasks you would do yourself if you had the time and energy — but they’re real. And that means my usual hard line of “And even if you ignore the moral, ethical, environmental, economic, and industry concerns about using LLMs: they don’t even work” no longer applies. And in situations like a for-profit corporation lead by people from industry… ignoring the moral, ethical, environmental, economic, and industry concerns is de rigeur.

Add these to the sorta-kinda-okay things LLMs can do like natural language processing and aiding in training and refinement of machine translation models, and it looks as though we’re figuring out the “reheat the leftovers” and “melt butter and chocolate” use cases for these microwave ovens.

It still remains to be seen if, after the bubble pops, these nuclear-powered lake-draining art-stealing microwaves will find a home in many kitchens. I expect the fully-burdened cost will be awfully prohibitive for individuals who just want it to poorly regurgitate Wikipedia articles in a chat interface. It might even be too spicy for enterprises who think (likely erroneously) that they confer some instantaneous and generous productivity multiplier. Who knows.

All I know is that I still don’t like it. But I’ll likely find myself using one before the end of the year. If so, I intend to write up the experience and hopefully address my blogging drought by publishing it here.

Another thing that happened this year that I alluded to in last year’s post was the Google v DOJ ruling in the US. Well, the first two rulings anyway. Still years of appeal to come, but even the existing level of court seemed to agree that the business model that allows Mozilla to receive a bucketload of dollabux from Google for search engine placement in Firefox (aka, the thing that supplies most of my paycheque) should not be illegal at this time. Which is a bit of a relief. One existential threat to the business down… for now.

But mostly? This year has been feeling a little like 2016 again. Instead of The Internet of Things (IoT, where the S stands for Security), it’s genAI. Instead of Mexico and Muslims it’s Antifa and Trans people. The Jays are in the postseason again. Shit’s fucked and getting worse. But in all that, someone still has to rake the leaves and wash the dishes. And if I don’t do it, it won’t get done.

With that bright spot highlighted, what are my predictions for the new year:

  • I will requisition a second work monitor so I stop using personal hardware for work things.
  • FOG Migration (aka the Instrumentation Consolidation Project) will not fully remove all of Legacy Telemetry by this time next year. There’s evidence of cold feet on the “change business metrics to Glean-sent data” front, and even if there weren’t, there’s such a long tail that there’s no doubt something load-bearing that’d delay things to Q4 2025. I _am_ however predicting that FOG Migration will no longer being all-encompassing work — I will have a chance to do something else with my time.
  • I predict that one of the things I will do with that extra time is, since MoCo insists on a user population measurement KPI, push for a sensible user population measurement. Measuring the size of the user population by counting distinct _profiles_ we’ve _received_ a data packet from on a day (not that the data was collected on that day)? We can do better.
  • I don’t think there’s going to be an All Hands next year. If there is, I’d expect it to be Summit style: multiple cities simultaneously, with video links. Fingers crossed for Toronto finally getting its chance. Though I suppose if the people of the US rose up and took back their country, or if the current President should die, that could change the odds a little. Other US administrations saw the benefit of freedom of movement, regardless of which side of the aisle.
  • Maybe the genAI bubble will have burst? Timing these things is impossible, even if it weren’t the first time in history that this much of the US’ (and world’s) economy is inflating it. The sooner it bursts, the better, as it’s only getting bigger. (I suppose an alternative would be for the next shiny thing to happen along and the interest in genAI to dwindle more slowly with no single burst, just a bunch of crashes. Like blockchain/web3/etc. In that case a slower diminishing would be better than a sooner burst.)
  • I predict that a new MoCo CEO will have been found, but not yet sworn in by this time next year. I have no basis for this prediction: vibes only.

To another year of supporting the Mission!

:chutten

Perfect is the Enemy of Good Enough

My Papa, my mother’s father, C. J. Mortimer died in Saint John, New Brunswick in 2020. Flying through the Toronto and Montreal airports in September to his funeral was one of the surreal experiences of my life, with misting tunnels of aerosolized alcohol to kill any microbe on your skin, hair, clothes, and luggage; airport terminals with more rodent traps than people; and a hypersensitivity to everyone’s cough and sniffle that I haven’t been able to shake.

I was angry, then. I’m still angry. Angry that I couldn’t hug my grandmother. Angry that weeping itself was complicated and contagious. Angry that I couldn’t be together or near or held. Angry that I was putting my family at home at risk by even going. Angry that we didn’t hold the line on the lockdowns long enough to manage the disease properly. Angry at the whiners.

This isn’t a pandemic post, though. Well, no more than any post I’ve made since 2020. No more than any post I will make for the foreseeable.

This is a post about what my grandfather gave to me.

Y’see, I’m not the first computer nerd in the family. My Grampy, my father’s father, was and my father is a computer nerd. Grampy’s memoirs were typed into a Commodore 64. Dad is still fighting with Enterprise Java, of all things, to help his medical practice run smoothly.

And Papa? In the 60s he was offered lucrative computer positions at Irving Oil in Saint John and IBM in the US. Getting employment in the tech industry was different in those days, not leastwise because the tech industry didn’t really exist yet. You didn’t get jobs because you studied it in school, because there weren’t classes in it. You didn’t get jobs because of your experience in the field, because the most experienced you could be was the handful of years they’d been at it. You didn’t get jobs because of your knowledge of a programming language, because there were so few of them and they were all so new (and proprietary).

So what was a giant like International Business Machines to do? How could it identify in far-flung, blue-collar Atlantic Canada a candidate computer programmer? Because though the tech industry didn’t exist in a way we’d necessarily recognize, it was already hungrier for men to work in it than the local markets could supply.

In my Papa’s case, they tested his aptitude with the IBM Aptitude Test for Programmer Personnel (copyright 1964):

Logo and explanation from the front cover of a "IBM Aptitude Test for Programmer Personnel" with directions that read "1. Do not make any marks in this booklet. 2. On the separate answer sheet print your name, date, and other requested information in the proper spaces. 3. Then wait for further instructions.". The design is geometric and bland but not unpleasant.

Again, though, how do you evaluate programmer aptitude without a common programming language? Without common idioms? Without even a common vocabulary of what “code” could mean or be?

IBM used pattern-matching questions with letters:

Instructions reading "In Part I you will be given some problems like those on this page. The letters in each series follow a certain rule. For each series of letters you are to find the correct rule and complete the series. One of the letters at the right side of the page is the correct answer. Look at the example below."
The provided example, marked "W." reads "a b a b a b a b" followed by five possible numbered answers "a b c d e".

And pattern-matching questions with pictures:

Instructions reading "In Part II you will be given some problems like those on this page. Each row is a problem. Each row consists of four figures on the left-hand side of the page and five figures on the right-hand side of the page. The four figures on the left make a series. You are to find out which one of the figures on the right-hand side would be the next or the fifth one in the series. Now look at example X". Example X is four squares, each with a single quadrant shaded. In order, top-right, bottom-right, bottom-left, top-left. The five possible answers labeled A through E are squares with one quadrant shaded (A bottom-right, B top-right, C bottom-left, D top-left), and a square with no quadrant shaded (E).

And arithmetic reasoning questions:

Instructions reading "In Part III you will be given some problems in arithmetical reasoning. After each problem there are five answers, but only one of them is the correct answer. You are to solve each problem and indicate the correct answer on the answer sheet. The following problems have been done correctly. Study them carefully." followed by "Example X: How many apples can you buy for 80 cents at the rate of 3 for 10 cents? (a) 6 (b) 12 (c) 18 (d) 24 (e) 30"

And that was it. For the standardized portion of the process, at least.

Papa delivered this test to my siblings and I when I think I was in Grade 9, so about 15 years of age. Even my 2- and 4-year-younger siblings performed well, and I and my 2-year-older sibling did nearly perfectly. Apparently the public education system had adapted to turning out programming personnel of high aptitude in the forty years or so since the test had been printed.

I was gifted Papa’s aptitude test booklet, some IBM flowcharting and diagramming worksheets, and a couple example punchcards before his death. I was thrilled to be entrusted with them. I had great plans for high-quality preservation digitization. If my Brother multi-function’s flatbed scanner wouldn’t do the trick, I’d ask the local University’s library for help. Or the Internet Archive itself!

The test booklet sat on my desk for years. And then Papa died. I placed the bulletin from the funeral service next to it on my desk. They both sat on my desk for further years.

I couldn’t bring myself to start the project of digitizing and preserving these things. I just couldn’t.

Part of it was how my brain works. But I didn’t need a diagnosis to develop coping mechanisms for projects that were impossible to start. I bragged about having it to my then-coworker Mike Hoye, the sort who cared about things like this. Being uncharacteristically prideful in front of a peer, a mentor, that’d surely force me to start.

They sat on my desk for years more.

We renovated the old spare room into an office for my wife and moved her desk and all her stuff out so I could have the luxury of an office to myself. We repainted and reorganized my office.

I looked at the test booklet.

I filed it away. I forgot where. I gave up.

But then, today, I read an essay that changed things. I read Dr. Cat Hicks’ Why I Cannot Be Technical. Not only does she reference Papa’s booklet (“Am I the only person who is extremely passionate about getting their hands on a copy of things like the IBM programmer aptitude tests from the 60s?”) but what she writes and how she writes reminds me of what drew me to blogging. What I wanted to contribute to and to change in this industry of ours. The feeling of maybe being a part of a movement, not a part of a machine.

I searched and searched and found the booklet. I looked at the flatbed scanner and remembered my ideas of finding the ideal digitization. The perfect preservation.

I said “Fuck it” and put it on the ground and started taking pictures with my phone.

To hell with perfect, I needed good enough.

I don’t remember what else was involved in IBM’s test of my Papa. I don’t even know if they conducted it in Canada or flew him to the States. He probably told me. I’m sorry I don’t remember.

I don’t know why he never kept up with programming. I don’t remember him ever working, just singing beautifully in the church choir, stuttering when speaking on the telephone, playing piano in the living room. He did like tech gadgets, though. He converted all our old home movies to DVD without touching a mouse or keyboard. I should’ve asked him why he never owned a minicomputer.

I do know why he didn’t choose the IBM job, though. Sure, yes, he could stay closer to his family in Nova Scotia. Sure, he wouldn’t have to wear quite as many suits. But the real crux was the offer that Irving gave him. IBM wanted him as a cog in their machine. Another programming person to feed into their maw and… well, who knows what next. But Irving? Well, Irving _also_ wanted that, true. They needed someone to operate their business machines for payroll and accounts and stuff.

But when the day’s work was done? And all the data entry girls (because of course they were all women) were still on the clock? And there were CPU cycles available?

Irving offered to let my Papa input and organize his record collection.1

My recollection of my grandfather isn’t perfect. But perhaps it’s good enough.

:chutten

  1. Another thing I have in my good enough memory is that, to have the mainframe index his 78s, Papa needed to know the longest title of all the sides in his collection. It’s a war song. And prepare your historical appreciation goggles because it’s sexist as hell in 2025. But I may never forget 1919’s “Would You Rather Be A Colonel With an Eagle on Your Shoulder or a Private With a Chicken on Your Knee?↩︎

Operating a Prius Prime SE 2024: the first three months

Choosing the right car for us

Our first vehicle was, until late last year, our only vehicle: a 2009 Honda Fit we acquired at the end of 2008. Once it hit fifteen years old, we started looking for what would replace it. (Unfortunately we live in a part of Canada that isn’t downtown Toronto, Vancouver, or Montreal meaning that the country has been built in a way that requires car ownership.) We toyed with the idea of a full electric vehicle (a Battery Electric Vehicle or BEV) but I was the only driver in the household who found it neat to manage charge volumes and charger availability and regular prolonged recharge stops and on and on (aka “the BEV lifestyle”) so we didn’t end up going that route.

(( And let’s not forget to note that the criminally negligent policies and regulations around automotives in Canada have perverted the incentives of car makers to make not more than a token amount of a token variety of kinds of vehicle that can burn electrons pulled from a wall. Your choices in this country are basically Teslas or nothing, and Teslas can suck it. ))

We put a deposit down on a Toyota Prius Prime plug-in hybrid electric vehicle (PHEV for short — a car that runs both on stored electricity drawn from a socket as well as chemical energy liberated by exploding hydrocarbons) in mid 2023 with a probable delivery date of mid 2025. The Prius Prime with its all-electric range of 72km (in ideal conditions) would suit basically all of our use cases from day-to-day and week-to-week, and its range including the hybrid drivetrain (and let’s be frank: oversized gas tank) of around 900km would more than handle visits to far-flung family members. That it’s too long, too wide, and too heavy is annoying, but it was in 2023 and remained in 2024 the least-worst option.

Come mid-late 2024, I reach out to double-check that everything is still as it should be and just happen to send my email on the day that two Prius Primes were on the lot, ordered but unbought by people earlier than us on the list.

It was thus to our pleasant surprise that we were offered the opportunity to get our chosen new vehicle nearly a full year ahead of schedule at the end of October, 2024. Which was good, because our venerable Fit was making ever-more-concerning old-age noises.

Three months in

It’s fine?

It is definitely fulfilling the expected role of being able to bop around town only ever running on very clean electricity. We’re still getting into the habit of plugging it in when we park it so it’s always topped up, and I’m still learning just what a difference it makes when it’s cold or there’s a headwind. It’s being thwarted a bit by the weather and having two very different drivers, but it’s becoming a better estimator of its own range, getting as high as 53km in subzero (but not face-hurtingly-cold) temps. All in all I’ve so far never really been unpleasantly surprised by the beast.

But it _is_ a beast. We were going to park both it and the Fit in a two-car garage, but there’s no way to do that _and_ still have room to take out the garbage. Or get to our bicycles. Or gardening equipment. Or freezer. (And I went to such an effort to clean out the garage so we’d be able to. Alas.)

And it’s a bit of a beast to drive: it’s heavy. It has more power than I know what to do with, beyond getting it up to speed in a reasonable time. It does lead to having a very smooth ride, though, which I appreciate given the seasonal road deterioration.

I’m still finding new systems to turn off, though. Toyota packed it with all sorts of assists: lane-keeping, distance-keeping, cross-traffic-avoiding, lane-following, etc etc… quite a lot of them are pretty okay. Parking assist letting me know precisely how far my front or rear bumper is to what I’m parking next to? Wonderful. Adaptive cruise control that keeps its distance from any car in front of me? I like it.

But so many of these systems are taking a page from the Tech Industry and are being shipped while their behaviour is still, to a degree, stochastic. The driver inattention monitor 1) Uses a camera pointed at your face, which I hate, and 2) Can’t handle eyeglasses or sunglasses. Lane-keeping will tug the wheel if you’re stretching into the oncoming lane to avoid a cyclist (which the car failed to recognize). Lane-following will beep and give up if there’s snow on the road. The cross traffic monitor will yell at you when you take your foot off the brake, even if you’re just crawling forward to see around the tall grass. And will fail to notice cars behind you while reversing out of a parking space some of the time.

Meanwhile, they could’ve shipped deterministic systems that I’d love to leave on. Like remembering infotainment settings per driver (keyed to the key). Or allowing us to turn off the headlights when in Park gear or either of the Accessory modes. Or telling me the kWh it’s pulling down when charging, or how much it charged, or allowing me to start a charge outside of the schedule from the charging port instead of having to jump back behind the wheel. Or even just telling me why it’s running the gas-powered engine instead of the electrical one against my express wishes (reasons I know about from reading the manual (of course I read the manual): starting the front windshield defroster, it reaching -12 outside, it running out of electrons in the battery (aside from the 30% reserved for running the hybrid)).

And Android Auto? What a piece of junk that is. Unreliable connection, inability to compose messages on even Google Talk (now called Chat? Teams? GTalk? Meet? ICQ? Who knows), poor UI integration with VLC, keeps trying to play music on YouTube Music even when I tell it to stop.

And the bloody app? What a joke. Overflowing text. Terrible UI choices. Obvious mistranslation. Inability to open web links. Inscrutable organization. The only reason I keep using it is because it’s January and I can remote-start the heat pump, in-seat and in-steering-wheel heaters, and rear defrost. And its UI for creating charging schedules is at least better than trying to do so via the steering wheel controls.

It’s really easy to blame Canadian car culture (heavily imported from the US) for most of these problems, and the tech industry for the rest. Of course the car is too big: bigger cars are the current fad, against rhyme and reason. Of course the app and Android Auto are trash: there is no functional competition or regulation keeping these companies in check.

Not to say that there aren’t things that I don’t like about it. Heated seats and steering wheel. The smooth ride. The comfy seats. The styling of the interior and exterior. The backup camera (required by law in Canada since 2018). The USB ports. The sound system.

So, three months in: it’s fine. It was in 2023 and in 2024 the least-worst option, at least for us. And after owning it three months and into 2025, it still really is no more or less than that. If it were less car and less tech it could have been so much better. Alas.

Nine-Year Moziversary

On this day (or near it) in 2015, I joined the Mozilla project by starting work as a full-time employee of Mozilla Corporation. I’m two hardware refreshes in (I was bad for doing them on time, leaving my 2017 refresh until 2018 and my 2020 refresh until 2022! (though, admittedly, the 2020 refresh was actually pushed to the end of 2021 by a policy change in early 2020 moving from 2-year to 3-year refreshes)) and facing a third in February. Organizationally, I’m three CEOs and sixty reorgs in.

I’m still working on Data, same as last year. And I’m still trying to move Firefox Desktop to use solely Glean for its data collection system. Some of my predictions from last year’s moziversary post came true: I continued working on client code in Firefox Desktop, I hardly blogged at all, we continue to support collections in all of Legacy Telemetry’s systems (though we’ve excitingly just removed some big APIs), Glean has continued to gain ground in Firefox Desktop (we’re up to 4134 metrics at time of writing), and “FOG Migration” has continued to not happen (I suppose it was one missed prediction that top-down guidance would change — it hasn’t, but interpretations of it sure have), and I’m publishing this moziversary blog post a little ahead of my moziversary instead of after it.

My biggest missed prediction was “We will quietly stop talking about AI so much, in the same way most firms have stopped talking about Web3 this year”. Mozilla, both Corporation and Foundation, seem unable to stop talking about AI (a phrase here meaning “large generative models built on extractive data mining which use chatbot UI”). Which, I mean, fair: it’s consuming basically all the oxygen and money in the industry at the moment. We have to have a position on it, and it’s appropriating “Open” language that Mozilla has a vested interest in protecting (though you’d be excused for forgetting that given how little we’ve tried to work with the FSF and assorted other orgs trying to shepherd the ideas and values of Open Source in the recent past). But we’ve for some reason been building products around these chatbots without interrogating whether that’s a good thing.

And you’d think with all our worry about what a definition of Open Source might mean, we’d make certain to only release products that are Open Source. But no.

I understand why we’re diving into products and trying to release innovative things in product shape… but Mozilla is famously terrible at building products. We’re okay at building services (I’m a fan of both Monitor and Relay). But where we seem to truly excel is in building platforms and infrastructure.

We build Firefox, the only independent browser, a train that runs on the rails of the Web. We build Common Voice, a community and platform for getting underserved languages (where which languages are used is determined by the community) the support they need. We built Rust, a memory-safe systems language that is now succeeding without Mozilla’s help. We built Hubs, a platform for bringing people together in virtual space with nothing but a web browser.

We’re just so much better at platforms and infrastructure. Why we don’t lean more into that, I don’t know.

Well, I _do_ know. Or I can guess. Our golden goose might be cooked.

How can Mozilla make money if our search deal becomes illegal? Maintaining a browser is expensive. Hosting services is expensive. Keeping the tech giants on their toes and compelling them to be better is expensive. We need money, and we’ve learned that there is no world where donations will be enough to fund even just the necessary work let alone any innovations we might try.

How do you monetize a platform? How do you monetize infrastructure?

Governments do it through taxation and funding. But Mozilla Corporation isn’t a government agency. It’s a conventional Silicon Valley private capital corporation (its relationship to Mozilla Foundation is unconventional, true, but I argue that’s irrelevant to how MoCo organizes itself these days). And the only process by which Silicon Valley seems to understand how to extract money to pay off their venture capitalists is products and consumers.

Now, Mozilla Corporation doesn’t have venture capital. You can read in the State of Mozilla that we operate at a profit each and every year with net assets valued at over a billion USD. But the environment in which MoCo operates — the place from which we hire our C-Suite, the place where the people writing the checks live — is saturated in venture capital and the ways of thinking it encourages.

This means Mozilla Corporation acts like its Bay Area peers, even though it’s special. Even though it doesn’t have to.

This means it does layoffs even when it doesn’t need to. Even when there’s no shareholders or fund managers to impress.

This means it increasingly speaks in terms of products and customers instead of projects and users.

This means it quickly loses sight of anything specifically Mozilla-ish about Mozilla (like the community that underpins specific systems crucial to us continuing to exist (support and l10n for two examples) as well as the general systems of word-of-mouth and keeping Mozilla and Firefox relevant enough that tech press keep writing about us and grandpas keep installing us) because it doesn’t fit the patterns of thought that developed while directing leveraged capital.

(( Which I don’t like, if my tone isn’t coming across clearly enough for you to have guessed. ))

Okay, that’s more than enough editorial for a Moziversary post. Let’s get to the predictions for the next year:

  • I still won’t blog as much as I’d like,
  • “FOG Migration” might actually happen! We’ve finally managed to convince Firefox folks just how great Glean is and they might actually commit official resources! I predict that we’re still sending Legacy Telemetry by the end of next year, but only bits and pieces. A weak shadow of what we send today.
  • There’ll be an All Hands, but depending on the result of the US federal election in November I might not attend because its location has been announced as Washington DC and I don’t know if the United States will be in a state next year to be trusted to keep me safe,
  • We will stop putting AI in everything and hoping to accidentally make a product that’ll somehow make money and instead focus on finding problems Mozilla can solve and only then interrogating whether AI will help
  • The search for the new CEO will not have completed by next October so I’ll still be three CEOs in, instead of four
  • I will execute on my hardware refresh on time this February, and maybe also get a new monitor so I’m not using my personal one for work.

Let’s see how it goes! Til next time.

:chutten

So I’ve Finished: Lies of P (PS5)

I recently finished playing Lies of P after a single playthrough of the main story, collecting what extra collectables and delving what optional areas I found along the way. I came away from it wondering what fans like about soulslike games, disappointed in the writing and voice acting and score (though the optional collectable songs were lovely), and soured on the genre as a whole. Spoilers follow.

This game feels like they wanted to hit a certain mood (sour, gross, sad, gloomy) and a certain game design philosophy (tough, derisive, “fair”). And goodness did they succeed. But I don’t think it’s for me.

I like the philosophy of levelling up the player instead of the character. The character doesn’t accumulate experience points for failing to advance (in fact: the opposite), but you as the player accumulate experience in the attempt. And that makes subsequent attempts more likely to succeed. However, the way they ensure this arc is by laughing at the player: hiding enemies around corners to surprise you only the first time, having pitfalls to catch you only the first time. Yeah, of course it feels like my (the player’s) experience is valuable in subsequent runs… but only because jumpscares only work the first time.

For bosses, it’s the same thing but instead of pitfalls and hidden enemies, it’s hidden rhythms in the moveset and unknown numbers of stages. This appears to be the more “pure” expression of the philosophy of player experience over character experience points, though, as even knowing and having seen the entirety of a boss doesn’t mean you can avoid the punishment for failure. Repetition (training) is what grants you the resilience to outlast the onslaught and sneak in your attacks just enough so their health reaches zero just before yours.

If you’re familiar with soulslikes, I apologize for writing out stuff you already know. This was my first of this genre and I don’t think I like it. Though the philosophy appeals to me academically, I struggle to imagine an expression of it that doesn’t involve laughing at the player. I don’t know that there’s an expression of it that isn’t _mean_. And I don’t like that relationship between video game and player: to me we’re collaborators in my enjoyment. We’re in this together to trick me into not optimizing the fun out of the experience, to divert my attention from the real world for a while, and maybe to get me to think about things in a new way.

I believe the enjoyment in these games is supposed to be catharsis from overcoming a challenge with, predominantly, your improved mastery over the game’s systems. For some reason, that doesn’t stick with me. Defeating a boss, making it through a dangerous area unscathed… that feeling doesn’t last long, replaced quickly with frustration when there’s another pitfall or mean punishment for stepping foot in a new place or swinging a sword against an enemy for the first time. And many times even the catharsis was sour as it didn’t feel as I did anything better on the run that succeeded over the runs that failed.

On top of not being really sure I like this genre, or how others like this genre, I’m unsure that this is a perfect example of the type. There’s three decision prompts in the dialog system that all serve the same purpose. The writing is very tell don’t show, the voice acting is unevenly skilled, and the antagonist motivations range from cliche to nonsensical. At some point I began wondering if I was playing the game incorrectly: I never really wanted to use any of the items or any of the Legion Arms. Heck, I mostly forgot about Fable Arts, and never customized a weapon except to upgrade its damage level. Was I missing the joy because I didn’t play with all the toys? Or did I do the best I could with systems that were neither necessary nor pleasant to use?

The one thing I liked was the portrait I found in a house that grew a nose whenever I lied or did something else “human” (as opposed to “puppet”). It was goofy and gamey and strange and unsettling and odd. Wonderful. And that I could’ve walked right past it without noticing felt nice. Would that the rest of the game’s mechanics had been similarly playful in tone.

All in all, I didn’t like the game. It performed and responded well to my inputs, communicated its mechanics in a way that encouraged engagement, and had a difficulty that was surmountable after challenge… but it was mean, frustrating, nonsensical, gloomy, overwrought, and unfun. If it is indeed a typical exemplar of its genre, I might recommend it to others who like this kind of thing. Otherwise, I don’t think I could recommend it at all.

How to go from “Looks like something changed in a Firefox Desktop version” to “Here is a list of potential culprit bugs”

This will mostly be helpful to Firefox Desktop folks, so if you’re not one of those, please instead enjoy a different blogpost. I recommend this one about the three roles of data engagements.

So you’ve found yourself a plot that looks like this:

A timeseries bar plot that begins as an uptake curve then has a sudden drop around February 22. There is no legend and no y-axis as they are unimportant, and sometimes I like to be cagey about absolute figures.

You suspect this has something to do with a code change because, wouldn’t you know it, the sharp decline starts around Feb 22 and we released Firefox 123 on Feb 20. But where do you go from here? Here’s a step-by-step of how I went from this plot arriving in Slack#data-help to finding the bugfix that most likely caused the change:

1. Ensure this is actually a version-specific change

It’s interesting that the cliff in the plot happened near a release day, and it’s an excellent intuition to consider code releases for these sorts of sea-changes in data volume or character. But we should verify that this is the case by grouping by mozfun.norm.truncate_version(app_version, 'major') AS major_version which in our case gives us:

The same timeseries bar plot as before, but coloured to show groups by major Firefox Desktop version. The cliff happens solely in the colours for Firefox 123 and above.

Sure enough, in this case the volume cliff happens entirely within the Firefox 123+ colours. If this isn’t what you get, then it’s somewhat less likely that this is caused by a client code change and this guide might not help you. But for us this is near-certain confirmation that the change in the data is caused by a code change that landed in Firefox 123… but which one?

( This is where I spent a little time checking some frequent “gotcha” changes that could’ve happened. I checked: was it because data went from all-channel to pre-release-only? (No, the probe definitions didn’t change and the fall isn’t severe enough for that (would look more like an order of magnitude)) Was it because specific instrumentation within the group happened to expire in Fx123? (No, the first plot is grouped by specific probe, and all of the groups shared the same shape as their sum) Was it an incredibly-successful engagement-boosting experiment that ended? (No, there haven’t been any relevant experiments since last July) )

2. Figure out which Nightly builds are affected

Firefox Desktop releases new software versions twice a day on the Nightly channel. We can look at the numbers reported by these builds to narrow down what specific 12h period the code landed that caused this drastic shift. Or, well, you’d think we could, but when you group by build_id you get:

Another bar plot, but instead of the x-axis being time it is now "build id" which is a timestamp of a sort. The data is all over the place and patchy with no or little clear pattern.

Because our Nightly population isn’t randomly distributed across timezones, there are usage patterns that affect the population who use which build on which day. And sometimes there are “respins” where specific days will have more than 2 nightlies. And since our Nightly population is so small (You Can Help! Download Nightly Today!), and this data is a little sparse to begin with, little changes have big effects.

No, far more commonly the correct thing to do is to look at what I call a “build day”. This is how GLAM makes things useful, and this is how I make patterns visible. So group by SUBSTR(build_id, 1, 8) AS build_day, and you get:

It looks like a timeseries bar plot, but the x-axis is "build day" so it isn't quite. Notably, there's a sudden cliff starting with the nightlies for January 18.

Much better. We can see that the change likely landed in Jan 18’s nightlies. That Jan 18-20 are all of a level suggests to me that it probably ended up in all of Jan 18’s nightly builds (if it only landed in one of the (normally) two nightly builds we’d expect to see a short fall-off where Jan 18 would be more like an average between Jan 17 and 19.).

Regardless of when during the day, we’re pretty sure we have this nailed down to only one day’s worth of patches! That’s good… but it could be better.

3. Going from build days to pushlog

Ever since I was the human glue keeping the (now-decommissioned) automated regression detection system “alerts.tmo” working, I’ve had a document on my disk reminding me how to transform build days or build_ids into a “pushlog” of changes that landed in the suspect builds. This is how it works:

  1. Get the hg revisions of the suspect builds by looking through this list of all firefox releases for the suspect builds’ ids. You want the final build of the day before the first suspect build day and the final build of the final suspect build day, which in this case are Jan 17 and Jan 18, so we get f593f07c9772 and 9c0c2aab123:
A visual excerpt of the firefox releases list https://hg.mozilla.org/mozilla-central/firefoxreleases. For illustration only.
  1. Put them into this template: https://hg.mozilla.org/mozilla-central/pushloghtml?fromchange={}&tochange={} — which gives us https://hg.mozilla.org/mozilla-central/pushloghtml?fromchange=f593f07c9772&tochange=9c0c2aaab123

This gives you a list of all changes that are in the suspect builds, plus links to the specific code changes and the relevant bugs, with the topic sentence from each commit right there for you. Handy!

4. Going from a pushlog to a culprit

This is where human pattern matching, domain expertise, organizational memory, culture and practices, and institutional conventions all combine… or, to put it another way, I don’t know how to help you get from the list of all code that could have caused your data change to the one (or more) likely suspects. My brain has handily built me a heuristic and not handed me the source code, alas. But I’ve noticed some patterns:

  • Any change that is backed out can be disregarded. Often for reasons of test failures changes will be backed out and relanded later. Sometimes that’s later the same day. Sometimes that’s outside our pushlog. Skip any changes that have been backed out by disregarding any commits from a bug that is mentioned before a commit that says “Backed out N changesets (bug ###)…”.
  • You can often luck out by just text searching for keywords. It is custom at Mozilla to try to be descriptive about the “what” of a change in the commit’s topic, so you could try looking for “telemetry” or “ping” or “glean” to see if there’s anything from the data collection system itself in there. Or, since this particular example had to do with Firefox Relay’s integration with Firefox Desktop, I looked for “relay” (no hits) and then “form” (which hit a few times, like on the word “information”, … but also on the culprit which was in the form detector code.)
  • This is a web view on the source code, so you’re not limited to what it gives you. If you have a mozilla-central checkout yourself, you can pull up the commits (if you’re using git-cinnabar you can use its hg2git functionality to change the revs from hg to git) and dump their sum-total changes to a viewer, or pipe it through grep, or turn it into a spreadsheet you can go through row-by-row, or anything you want. I’m lazy so I always try keywording on the pushlog first, but these are always there for when I strike out.

5. Getting it wrong

Just because you found the one and only commit that landed in a suspect build that is at all related, even if that commit’s bug specifically mentions that it fixed a double-counting issue, even if there’s commentary in the code review that explains that they expect to see this exact change you just saw… you might be wrong.

Do not be brusque in your reporting. Do not cast blame. And for goodness’ sake be kind. Even if you are correct, being the person who caused a change that resulted in this investigation can be a not-fun experience. Ask Me How I Know.

Firefox Desktop is a complex system, and complex systems fail. It’s in their nature.


And that’s it! If you have any comments, question, or (better yet) improvements, please find me on the #glean:mozilla.org channel on Matrix and I’d love to chat.

:chutten

So I’ve Finished: Final Fantasy XVI

I’ve finished playing Final Fantasy XVI after completing the storyline and all side quests and hunts. It was a visually-stunning but stiltingly-animated JRPG romp with a more adult tone but childish treatment of themes and characters that ultimately satisfied mostly on the back of its real-time action battle system. Spoilers follow.

This is my Active Time Lore Appreciation Paragraph. I will hear nothing bad said about Active Time Lore as the ability to pause any cutscene at any time and be able to remind myself what the heck is going on is invaluable to me and anyone else who can’t devote hours every day to keep a game fresh in the mind. Plus, it helps flesh out the things that no character would ever say but might be bloody interesting to know, like the symbolism of the Sanbreque Imperial Flower gobbin. There’s always a tension in high fantasy between building a world Not Like Our Own but having to make it comprehensible to an audience that only knows our own world. Add in a visual show-don’t-tell medium like video games, and your narrative lens is almost exclusively through characters that already know everything about their world. You can dump in an amnesiac or isekai in a high schooler to give yourself someone to explain the weird and interesting stuff to… or, if, like Final Fantasy XVI, the narrative doesn’t want that, you can, like Final Fantasy XVI, be careful to keep the fantasy word salad to a minimum while providing backstory via Active Time Lore. Very nice.

This is my Vivienne’s Table Appreciation Paragraph. When at your Act 2 hideout you can review the entire cast in relation to each other and the map as it currently sits with motions of important characters and forces. So outstandingly helpful for all the same reasons as Active Time Lore.

A pity I never actually needed either of them.

A Squidward "daring today, aren't we" meme where the customer asks for a "Chosen one who is reluctant to answer the call" (Squidward replies "How original" in deadpan) and specifies the chosen one "needs everyone around him to tell him he's special", to which Squidward, holding back a smirk, replies "Daring today, aren't we"

The story and themes of Final Fantasy XVI are kinda boring. You’re the chosen one who falls from a privileged position to one of an oppressed class who then discovers that oppression is bad, actually. Through a mentor figure you are given an opportunity to fight back for yourself and your fellow people, but in no way that upsets the status quo that resulted in the existing power dynamic. You have a romantic subplot in which you are the subject and she is the object. Nobles (as in bloodlines) are noble (except for the evil one), and bloodlines are the best way to supply the right to lead (except for the evil one who is destroyed by it). In the final boss fight you kill god.

You know, the usual.

It keeps feeling like it wants to say something. It wants to liken crystals to oil, or something. It wants to liken the subhuman classification and treatment of Bearers to slavery or the treatment of indigenous peoples. It wants to liken the Blight to climate change. …but maybe that’s me wishing it had the will to say anything about anything at all, as there’s certainly nothing I saw in the text that would suggest this. Which is disappointing.

And it’s not afraid to treat the audience maturely. (And I don’t mean the sideboob and abattoir’s amount of gore.) It’s willing to supply two philosophies at odds with each other and not immediately resolve which one is “better”, most notably when the Templar-equivalent researchers sacrifice their brethren instead of the mission and Clive is all angry about it. Unresolved tension between schools of thought! Like maybe there isn’t a clear answer to every conflict?

Except that the mechanics of the game really hold it down. With no branching narrative, there’s no choices of meaning. With nothing but a sword, there’s no way to choose diplomacy or intrigue or cleverness to resolve things that are needed to progress. It is a fun sword to swing, mind: you spend an awful lot of time inside the battle system and it does satisfy. Attacks and abilities land solidly, enemy designs are sufficiently varied to keep it interesting, bosses hit like a dumptruck only after obvious windups. It’s fun in that realtime battle way: can you read and react in time. But when the battle is done it is sorely disappointing to be shown that not all bandits are bad, actually… and then immediately have more battles with bandits where you kill them really really dead (well, maybe they don’t die. There’s no clarity about whether “defeated” or “slain” actually means dead.).

What isn’t disappointing is the visual fidelity. The landscapes and humans are very well modeled and textured. Clive’s hair is really pretty, and moves exceedingly well. The draw distance appears infinite, and I only found one vantage point where the grass tiled diagonally: the rest of the wild and built world looked and felt like it had some supreme attention paid to it. (Except the water. Water’s hard. Though Horizon: Forbidden West had better water.)

The performance-capture-driven character animation is also a visual treat. Expressions, emotions, tiny gestures… the performance-capture cutscenes are well-directed and acted with motions and emotions small and large expressed exceedingly well in most cases. Jill checks her boot for mud just before the akhashic marlboro (sorry, they’re called “morbol” now) fight. Leaders wishing for deniability hide their mouths when talking. They paid attention, folks.

But there’s a sharp decline in animation fidelity once you’re out of performance capture. At my count there are three conversation systems: performance-capture cutscene, lip-flapping (though it’s clear the engine’s trying to match mouths to phonemes, it’s failing), and shopkeepers (who only voice the first line. You get to read the rest). None of them support branching dialogues. All but the first are really awful to look at, especially coming from Horizon: Forbidden West, let alone The Last of Us: Part II. Especially when they use a lower-fidelity system for Important Story Moments. Especially when the writing is so gosh-darn wordy that I can cut off characters mid-line and the same information is conveyed. For a game with nothing to say, it spends a lot of time saying it.

And it’s bonkers that they got the water reflections around the hideout so wrong and specifically turn the camera to frame them on the elevator. And how their inverse kinematics never seem to place people’s feet actually on the surfaces they’re standing on.

The voice acting is most excellent, though. You can really hear the cast giving it their all, and Clive has some truly emotional scenes that are sold convincingly (even if sometimes the animations don’t live up). Which is why it’s disappointing that Ultima can’t seem to decide whether to pronounce the ‘u’ in Mythos.

The score was nice. Maybe over-orchestrated for how thin the story and setting turned out to be… but maybe they were playing for the concept over the execution. No one told them they didn’t need to bring their A game and their forty-voice choir.

I still like it better than the XIII sequels. I like that they told a whole story, unlike XV. I like that they’re trying to age their series with its audience. I like that they kept chocobos and the victory fanfare and sixteen-bit sprites for some menu stuff. I really liked Cid.

I was disappointed that the visual fidelity couldn’t be supported at framerate. I couldn’t unsee how bad the lip-sync and water was. And worst of all, I can’t forgive that they had this world and cast and budget to say something and chose to not.

Recommended for fans of Final Fantasy and other RPGs that don’t have their hopes set too high.

So I’ve Finished: Persona 5

I recently completed the story of Persona 5 (not the Royal re-release), getting a little over half the achievements. It’s not my first experience with a JRPG with Lifestyle Simulator elements (I did play Fire Emblem: Three Houses (no So I’ve Finished article for that one, sorry)), but it’s only my second. I found it to be incredibly stylish, political-aesthetic, mechanically consistent, and enjoyable… but so, so very long. Spoilers ahead.

With no grounding in previous games of this type I really didn’t know how to handle the two “halves” of the game. You’re given latitude in challenging the dungeons over several in-game days. Coupled with sparse save points (how nostalgic!) and expensive/rare healing items you can’t replenish within the dungeon, there’s a clear push-your-luck framework. Do you have the stamina to get to the next save point, are you going to spend all this time getting part of the way there and fail, and how many of these rare/expensive healing items are you willing to expend to make it less likely you’ll wipe?

As for the second, Lifestyle Simulator, half, while there’s a dungeon to be delved you _can_ do some lifestyle stuff (hanging out with friends, studying for tests, eating burgers, etc.) but the game often interjects “Hey, are you -sure- you want to do that? Here’s an easy button to go to the dungeon instead.” It’s nice to be reminded, and there are some hard stops to try and keep a distracted player from going too far and entering an unwinnable situation, but it’s uncomfortable. So too is the helper companion Mona’s insistence in putting you someplace where the only thing you can do is go to sleep. If all I can do is sleep: just put me in bed already. Putting me in the room and having me choose sleep does not make me feel like I have agency.

Between the two it’s hard to figure out what exactly I’m “supposed” to be doing. Eventually I got the hint and did whatever I felt like, but going from more typical JRPGs like Final Fantasy XV, it felt weird to actually have freedom.

I feel as though I made the right choice playing it with the Japanese voice acting. Some of the voice lines have some of what I semi-affectionately call “anime bullshit” in them, and I’m primed to ignore the bullshit if it sounds like it comes from a Japanese voice actor. And it made the repetitive barks easier to bear.

Speaking of repetition, there are only like seven songs in this game. And 120 hours of gameplay. Yes, they do a clever thing and enrich the arrangement over time so it develops as the plot develops, but not nearly enough and not for every track. The saving grace is that all of them (except Mementos, which I took to playing on mute) are bangers, so I don’t really mind kicking into battle for the eleventy-millionth time to hear the same tune (though my wife started to):

Battle is an interesting change from other JRPGs I’ve played. Sure, yes, it’s attack and magic, item and escape. Take your turn, suffer the enemies’ turns, rinse and repeat. But there are meaningful changes that reinforce the game’s themes really satisfyingly. You’re a bunch of stylish, clever, thieves, right? So you’re weak as a wet paper bag. But your wit and charm give you your edge, if only you can turn the tables on your adversaries. Mechanically this means knowing the elemental weaknesses of the enemies (from the ten possibilities) and exploiting them until you have the upper hand. At that point you can talk them into giving you things (items or cash) or joining forces with you (hi ho, a-pokemon we go). Or you can smack them upside the head for ludicrous damage, likely ending the fight in one all-out attack. And if you started this battle by attacking from stealth and surprising the enemy? You might end the whole shebang without the enemies even having a chance to act. This results in a pleasant rotation on the JRPG battle formula: it makes more of a puzzle of it that rewards thoughtful play, emphasizes tension of the heist, and supports the game’s premise, setting, characterization, and themes.

It’s pretty good, is what I’m saying. And it looks damn sharp. I was worried going in. In screenshots and video the constant pulsing motion of UI elements, the arbitrary changes of font and highlighting of letters or phrases, the incredibly busy screens full of text — how could you play a game with all that going on?But no. Somehow in the transfer from looking at the game to playing it I always knew where to look and how to parse the information. It didn’t matter how busy the screen was, I could instantly get the information I needed. The visual density was a welcome enhancement as it gave me something interesting to look at when it was the fiftieth time I was in that menu.

So is what I’m saying is that it’s a stylish and cohesive game that everyone should play? Well… yes, it is very nice bumping around Tokyo (I want Tokyo metro in my life. Driving sucks.) hanging out with my friends and devising how to topple the systems of injustice unfairly and supernaturally holding power over us. But it gets weird in the corners of the systems.

Like relationships. P5 is half relationships and half JRPG. The reward for improving your relationships is tangible effects in the JRPG half of the game, lending you aid when and where you need it most. And the reward for maxing out your relationship is _never having to do relationship side quests with that person again_. Worse, if you’re then given an opportunity to hang out with someone you’re besties with, or even _in a romantic relationship with_, and someone else, it is mechanically more optimal to hang out with someone else instead (because getting more relationship points in a maxed-out relationship does you no good). This is the exact opposite of how the mechanics of battle mesh with and support the game. The mechanics of relationship building are in opposition to the text of building and maintaining relationships and their importance to the plot and themes of P5.

Social stats, which both fuel and are rewards for relationships, are another weird corner. In the late game certain events require you to have maxed out a social stat… only to then reward you with that stat as you progress. How this escaped testing boggles me. I can only assume the order you meet confederates was kept fluid until late in development.

And then there’s the game’s atrocious treatment of gay people. The “best” part about it is that the game pretty much ignores that gay people exist aside from two ignorant, backwards interactions. This game was released in 2016, c’mon. And for a game about fighting the system’s injustices, what would be better than fighting for equal recognition in a country where a majority of people support same-sex marriage despite it not being legal?

…which makes me wonder if the game really is about fighting the system. Yes, the supernatural god (it’s a JRPG, of course the final boss is God) convincing everyone to give up their free will for an easy path through life has been defeated and its hellscape earth has been destroyed. But the characters all need to put their faith in adults to “do the right thing” in a largely-unchanged status quo in the ending and epilogue. Mischief: yes. Reform: no.

This way lies the most resonance between mechanics and theme, for only this way does it explain why a cat telling you not to stay up late actually works on a supposed delinquent/rebel/thief/hero.

All this is to say that I found Persona 5 to be a game about aesthetics. Its veneer is very shiny and hip, and it’s willing to put lip service to a few interesting ideas. But when it gets deep in to the core it is more interested in preserving the status quo with few changes: to its battle mechanics, to its orchestration, to its social interactions, or to its world. It’s a game that could be mistaken for having something to say. But mostly it’s flashy entertainment.

Which isn’t nothing! It’s difficult to be entertaining. And it’s allowed to be “just” entertained.

But it disappoints me when something so much better was well within reach.

I recommend this game for fans of JRPGs and Life Simulators who have 120 hours to put into being entertained and can look past some blink-and-you’ll-miss-it hateful representations of queer folk.

So I’ve Finished: Kena: Bridge of Spirits (PS5)

Last year I finished a playthrough of the story and some of the side content of Kena: Bridge of Spirits, a 3D action-adventure game. I enjoyed exploring the world, the fighting and progression systems, the score, and most of all the art style. Spoilers follow.

First and foremost: how in the world do you pronounce her name? Is it Key-Na, or Kay-Na?

(19m26s-19m30s)

Ah, Kay-Na. I played this game and for the longest time I coulda sworn that they pronounced it both ways in the game. Anyway.

I looks and plays like an all-ages game. It has Uncharted-style climbing, plus some platformer traversal (Kena can double jump from the get-go). The style looks child-friendly, the soundtrack is anything but subtle, and the script is very simple. The polish is quite nice (though switching between animation states (walk, run, jump, fall, double-jump, attack, roll) is a bit jarring after spending some time in the crunch-fueled shine of The Last of Us Part II’s animations), and it controls very straightforwardly. Mix in a cute little soot-sprite species that you can dress up (by discovering and purchasing outfits with one of the several in-game currencies) and it’s pretty clear who the audience is expected to be, right?

But then there’s the bosses. I can’t help but notice the influence of, yes, Dark Souls. You need to dodge, parry, and go after those bosses again and again until you “git gud” and learn how to beat them. And then learn how to execute on learning how to beat them. I was _not_ expecting a game so friendly and, well, easy to have such punishing boss fights.

I was also not expecting it to be quite so obvious when they changed engine between cutscenes and gameplay. I’ve been spoiled by recent fads where everything is rendered in-engine, even if they turn up the quality knobs for story beats where they can control the camera. It was almost nostalgic to see the seams.

A bug report: If you turn off the “button legend” setting (telling you which buttons do what) then there’s no prompt for the one action that lets you escape the tutorial area by ducking under a tree (an action you never do again). I try turning off more of the screen clutter when giving the option (video games are a visual medium, and I’m easily distracted by HUD elements), and this one had me lost for a minute.

Another juxtaposition with the childlike world is how muddled the philosophy is. You’d expect an easy good vs. evil, maybe a little redemption… but no. And this is in contrast with the politics, which are openly conservative. A bit of that is in the “conserve the environment” sort of way, but a lot of it is also “accept your fate” and “listen to the elders and do what they tell you”. Which not only doesn’t resonate with me in particular, it doesn’t flow through to how they paint the “bad guy”. There’s an evil worldview of… trying to save people’s lives and livelihoods? And the good worldview of… sometimes entire villages just need to die? And there’s no conversation between the “good” philosophy and the “evil” one. It’s very disconnected, and not in the “it is actively trying to have nothing to say” blandness I’ve come to expect from corporate art. I just don’t know what it’s trying to say?

If you want a less conflicting and simplistic view of the inevitability of death, you’ll have to play Spiritfarer, I guess. And if you want a more cohesive and complete and consistent set of mechanics and worldbuilding, you can dig out your PS2 and play Beyond Good and Evil.

Recommended for people looking for that Jak and Daxter experience, but with lush Ghibli visuals and rich orchestral score… and only if you’re willing to wipe and repeat the bosses a couple handfuls of times.

So I’ve Finished: Gris (Steam Deck)

I recently finished playing Gris on my Steam Deck. I got some, but not all, of the collectables, and finished the main story. Gris is a 2D adventure-platformer built by Nomada Studio in 2018. It’s pretty, short, and did I mention pretty? Spoilers follow.

Gris joins Rime in the “adventure-platformer using grief as both a theme and the unsupported-by-evidence-yet-ubiquitous ‘five stages of grief’ as a level organization philosophy” genre. I think Rime’s is the better interpretation (though it ran terribly on my Switch), though Gris is the more polished experience.

It controls well, the character floating in a way that makes the platforming straightforward but not simple. The floating is also in keeping with the character’s conceit within the game world, which is nice. This is why it’s a little disappointing that sometimes the level doesn’t communicate well the difference between set dressing (you can walk past it, you can’t stand on it) and level geometry (a wall you cannot pass, a platform you can land on after a jump). Doesn’t feel good to try and make a super jump to find that the piece of background debris was a ledge all along. Nor does it feel nice to have to guess which walls are walls. Not much of a problem, really, just maybe highlights that the visuals were the priority more than the gameplay.

Which isn’t to say that it was neglected. The levels communicate intent wordlessly and very capably. The difficulty curves up very satisfactorily. The only time it seemed to be compromised was when it might have interfered with how pretty the world looked.

The music is as beautiful as the world and is only let down by a single riff that sounds like the Nier Automata menu for some reason? I’m not the first to notice that this:

Sounds distractingly like:

In no way am I suggesting that either is a copy of the other. The two games released within about a year of each other from development studios half a world apart (and with wildly different budgets), so it’s vanishingly unlikely.

All I’m saying is that it was distracting to me. It might be to you as well. Aren’t we weird little creatures that tie memory to noise? Anyhoo. Great music. A+.

Speaking of music, what a lovely idea giving the player a button to sing only to then reveal, heartbreakingly, that the character can’t. I like clever little touches like that.

I recommend this game to anyone who wants about 3-5 hours of pleasant and polished platforming in a wonderfully-rendered world.

(And for those who are wondering, it looks and sounds wonderful on the Steam Deck played portably. I was shocked by how good it sounded.)