The Virtue Score

The third oat milk latte of the day costs ten points. I decided that one evening in October, calmly, while building the thing that would charge me, and I haven’t had to decide it since. Counting is what actually works for me, so I got Home Assistant to do it. This is the build note I promised in Stop waiting for willpower.

The rules

Every morning at 5am the score goes back to 100. It can climb to 120 and it can’t go below zero. That’s the whole frame: a fresh start each day, and no way to dig a hole you can’t get out of.

The things that cost points are the ones that had crept in. Chocolate under 85% cocoa is ten. Cake or a pastry is fifteen. A takeaway instead of a meal I’d planned is ten. Caramel syrup in a coffee is twenty, which in practice means never.

Lattes have their own rule. I tap for each one, the first two of the day are free, and every one after that costs ten. The number of free ones is a setting on the score’s page, so I can tighten it later without rebuilding anything.

Fig. 1 · The tariff What costs points, and what earns themCOSTSSkipped gym, half a week-25Caramel syrup in a coffee-20Cake or pastry-15Chocolate under 85% cocoa-10Takeaway, not the plan-10Each latte after two-10EARNSA 40-minute ride+15A 30-minute walk+10Teeth before 9pm+10 (+5 after)Good night before 11+10Seven hours' sleep+107,500 steps+510,000 steps+5 moreFruit, up to twice+5Black coffee, up to twice+5Starts at 100 at 5am; caps at 120; never below 0.
Decided once, calmly. The costs are the things that had crept in.

Most of it counts itself

The part I like best is how little of it I have to do. Most of the good side arrives on its own.

The Home Assistant app on my phone passes on what the phone already measures. Its activity detection knows when I’m walking or cycling, so a half-hour walk earns 10 and a forty-minute ride earns 15 without me touching anything. Steps earn five at 7,500 and five more at 10,000. If the phone says I slept seven hours, the day starts with ten already in the bank.

The gym is the same. There’s a zone drawn round each of the two gyms I use, and it’s twice a week, in two halves. If my phone hasn’t spent at least 25 minutes inside one between Monday and Wednesday, I lose 25 on Wednesday night, and the same goes for Thursday to Sunday. Nobody has to press anything: the phone being there is the proof.

Fig. 2 · A day that counts itself A made-up map of a day that counts itselfthe River Oatthe Step Woodsthe Bench Hillswalk, 30 min+107,500 steps+510,000 steps+5 moreride, 40 min+15The Iron Hall25 min in the zoneThe Far Forge25 min in the zoneHomegood night before 11+10Na walka ridea gym zoneNot my real map. Every + on it counts itself, with no button pressed.
Most of the points arrive on their own. The phone notices the walk and the ride, the zones notice the gym, and good night does the rest.

Stacked on things I already do

The rest hangs off habits I already had. Fogg calls these anchors, and Atomic Habits calls it habit stacking: tie the new thing to something you already do.

Every night I say good night to Alexa, and a routine turns the house down for the night. That same routine now tells the score I’ve gone to bed, and before 11 on a work night it’s worth ten. I didn’t add a step. The step I already took now counts.

The by-hand ones are easy because there’s an Echo in most rooms. Fruit and my teeth are a phrase to Alexa. Lattes, a black coffee instead of one, and the sins are a tap on the score’s page on my phone.

Into the red

Below 60, the house notices. A note arrives on my phone, and if the office lights are on they go a sulky amber. The flag clears when the score is back to 60, or at 5am. It’s not a punishment so much as a mood. You can’t miss it, and it doesn’t nag.

The teeth streak

The habit I most wanted to stick was doing my teeth properly before 9pm, which also closes the kitchen for the night. So that one talks back. I say Alexa, I’ve done my teeth, or press the button, and if it’s before nine it’s worth ten points and the streak goes up. After nine it’s five, and the streak starts again tomorrow.

The Echo that heard me says something different depending on the streak: night one, two in a row, a week, a new best. Never a telling-off. If I forget, the 5am reset quietly zeroes the streak and writes the night’s result in the log.

How a point gets in

Whether it counted itself or I said it, every point ends at one of two scripts, one for losing points and one for earning them. Each caller hands over a price and a reason. The script keeps the score between 0 and 120, writes the reason in the logbook and tells my phone where I am. The prices sit with whatever calls it, and the two I expect to tune, how many lattes are free and when teeth stop counting, are settings on the page.

Fig. 3 · How a point gets in Most of it counts itselfCOUNTS ITSELFthe phone's walks,rides, steps, sleep;the gym zones;good nightBY HANDa phrase to Alexa,or a tap onthe phoneTWO SCRIPTSkeep it 0 to 120,write the reason,tell my phoneTHE SCORE100 at 5am,kept forthe long graphBELOW 60a phone note, amber office lightsPrices sit with whatever calls the scripts.
One place for the mechanics. Whether it counted itself or I said it, every point goes through the same two scripts.

It was built in an evening in October, from a sketch I’d talked through with Claude beforehand, the same way the rest of the house was rebuilt in Faking intelligence. There’s still no AI in the loop when it runs. The house just follows the rules it was taught.

Why counting works

It’s Fogg’s model in a box. The less there is to do, the more of it actually happens, and the easiest thing to do is nothing at all: go for the walk, and the walk gets counted. The score is a number I can see without having to remember or tot anything up. Nothing about my willpower changed. The thing I’m bad at, keeping count, is now the house’s job.

It also makes the decision once. When the third latte is tempting there’s nothing to decide. I just know it’s ten points.

What it should refuse to do

When Claude and I worked through it, the list of pitfalls was as long as the tariff, and none of them is built yet. Only movement and sleep should take the score above 100, so I can’t eat my way to a good day. As it stands, fruit twice and black coffee twice will do exactly that, which is the first thing to fix. Losses should be capped at 40 a day, so one bad afternoon can’t wreck the week. The house should say the score out loud no more than twice a day. And Saturday might be a day off, when it says nothing at all. A scoring system that nags is one you switch off, and then it counts nothing.

Room to grow

The goal is that anything that can count itself does. I’ve got a few Flic buttons, the little smart buttons you can stick anywhere, that I haven’t added yet. One by the bathroom sink would mean I press it after my teeth and don’t even need to say anything. My toothbrush is Bluetooth, too, and in principle the phone could notice it being used and pass that back to the house. That’s a rabbit hole I haven’t gone down yet.

At the moment the score itself is doing the job. If that ever stops being enough, the next step is stakes. Below a score I’d think too low for the day, not zero, just too low, money could go somewhere I’d hate it to go: a cause I don’t want to support, or a friend who’d take it with glee. I wouldn’t want it back. The point is how much I’d hate giving them the pleasure of watching me fail. That might be its own piece.

Keeping the history

My Home Assistant keeps every change, with its reason, for ten days. For the long run the score and the teeth streak are kept as long-term statistics: the low, high and average for each hour and day, forever, for almost no space. That’s enough to draw a graph over months, which is the only view that matters. One day is noise. The line over a season is the habit.

All musings