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.)

Eight-Year Moziversary

At the end of my post for my seven-year moziversary, I made some predictions about what was to be and now has been the next year of work. And I got them pretty spot-on:

Predictions for the next year of Moz Work:

  • There’ll be another All Hands
  • Glean will continue to gain ground in Firefox Desktop
  • “FOG Migration” will not happen

There was an all hands. It was in Montreal. It was fun to have folks come to a city I knew a little bit (though I’m still sore we didn’t get June 2020’s Toronto All-Hands). Poutine. Bagels. And a cirque-themed closing party.

Glean continued to gain ground on Firefox Desktop. Last year’s post mentioned over 100 Glean probes in Firefox Desktop. The current count as of time of writing is 368. Now, some of this is due to some projects our team have undertaken, but a lot of it is organic.

This is despite “FOG Migration” not happening. Firefox leadership remained uninterested in the prospect of migrating data collections to begin being sent in Glean. Though in Montreal there were some conversations that suggest that this might be changing.

So, what have I been up to? Well, I discovered in January that a legacy data collection system (PingCentre) was subject to some data loss that was incompatible with how the data was being used (( You can imagine that data loss would be acceptable for certain things like performance measurement or feedback, so long as you could characterize the loss (e.g. you lose stuff randomly? Only the small numbers? Only the feedback from Ottawa?). It’s less acceptable for retention or revenue. )). By March, replacing PingCentre had become a top-level OKR and I was managing the project.

So this year has been spent growing an appreciation for Project Management as a discipline. I now have more opinions about work tracking than I ever dreamed I’d have (though, no, I’ve not set up Kanban or anything else).

I’ve also continued my practice of basically never saying No to someone who had a question for me. As much as I bemoan the new tendency of questions being asked over direct message instead of in a topic channel where anyone can help, it does bring me no little joy to partner in a data exploration, consult on answering awkward privacy/data questions from contributors, or debug someone’s test file “out loud” so they can follow along. It really is the people that make Mozilla special, so helping them feels like a high calling.

Which is why I find our continued focus on “AI” to be so baffling. So much of “AI” we hear about is dragging the humanity out of the Internet that Mozilla is so keen to protect. We seem to be just as bad as the Valley for using “AI” to mean everything from outstanding work on local machine translation (now available in Firefox 118), to LLMs spouting out incorrect answers when you ask them to explain CSS. I hope we provide some clarity about what we mean when we say “AI”, and draw a thick line between what we’re doing and the grifts being peddled all around us at great cost to truth and the environment.

I understand that we need to be in a business to be able to speak about it. It’s why I’m excited that we’re giving social media some attention. I can’t wait to see what those teams create for the world. But the way everything became “AI” so fast sounds like chasing the hype cycle.

As for me, what do I expect to do? First, I expect to finish up the year by migrating Use Counters to Glean. Then… who knows? Maybe the results of the Events Work Week will exceed expectations and require more investment. Maybe I’ll find another data collection system in Firefox Desktop that’s dropping between 2% and 15% of all data that’ll need replacing. Maybe I’ll finally get to rewrite the IPC layer so it leaves the main thread alone. Yeah, okay maybe not.

Predictions for the next year of moz work:

  • I’ll work on client code in Firefox Desktop
  • I’ll not blog as much as I’d like
  • We continue to support existing collections in all of Legacy Telemetry’s core systems
  • There’ll be an All Hands (safe bet, as Dublin was announced in Montreal), and at least one more will be announced
  • Glean will continue to be used more on Firefox Desktop, and not just because Use Counters will juice the numbers (I will no doubt ascribe this increase to be disproportionately due to the (well-received) Glean talk I (finally) gave to a Firefox Front-End Engineering team)
  • “FOG Migration” will not happen, but new top-down guidance will be handed down expanding the circumstances where Glean is explicitly stated to be the data collection system system of choice in Firefox Desktop (and not just because it provides the best API to Legacy Telemetry)
  • We will quietly stop talking about AI so much, in the same way most firms have stopped talking about Web3 this year
  • I will publish the moziversary blog post actually _on_ my moziversary, unlike this year

Let’s see how that pans out.

:chutten

So I’ve Finished: Stray (PS5)

I recently finished playing Stray on the PS5. I accumulated a fair amount, but not all, of the game’s achievements over about seven hours of play. Stray is a moody, environmentally-rich platformer/puzzler where you play as a cat in a dystopian future. Spoilers follow.

I think the folks at BlueTwelve Studio may have underestimated just how much people just want to play as a cat. Not just in how many people reacted so enthusiastically to the game’s marketing, but in its gameplay. If they’d known, they never would have shipped with the “Show Cat Death” slider set to on, and they wouldn’t have spent so much time on running and shooting segments. Then you’d just be a cat with a drone buddy on a tour trying to reclaim its memories and collect badges for fetch quests and little optional puzzles.

If someone were to tell me that Stray was a showcase for the developers’ environmental design capabilities, I’d believe them. Every corner of every level had interesting and usually-unique stuff in it. The verticality of the dystopian slums that feels made for the cat, the dirt, the boxes, the books, the wires, the air conditioners… all of it was so wonderful. And so perfect to be explored from a camera positioned near a cat’s height off the floor. No corners cut here: the world invites scrutiny.

Now, corners felt cut a little in the character animation. It was an excellent choice to populate the world with robots: like how early Pixar went with toys because their tech could only really texture smooth things like plastic at the scale they needed, this made most loops and hitches in animation read as diagetic. The robots were just being robotic. Which I like. Very clever. But then when you press the dedicated meow button (there’s a dedicated meow button!) the cat doesn’t look like it’s meowing. It sounds like it is, but the animation is… not quite there. Like there was some amount of effort, but not enough.

And there’s not enough that I can do as a cat! Too much is scripted: you can only wind your way around the legs of a select few robots, you can only sleep in certain piles… and you can’t be held or pet? What’s with that?

Maybe the fault is mine: I was hoping to find in Stray a cat simulator. It has enough plot to exercise the setting and motivate us to move our cat through the stunningly-decorated (though oddly orientalistic) neon stacks. It has music to evoke and maintain a somber, contemplative mood. It has characters you want to help and you want to subvert. It lets you be sneaky and snarky.

But it also has a death mechanic. And a gun.

I dunno. I liked it. I liked being the cat, even when the game wanted to game instead of letting me be the cat. I liked knocking things over. I liked messing with robots for no reason. I liked jumping on air conditioners and signs and pipes and vending machines.

More games like this, please!