Feature Gravity
I don’t really think about code anymore.
It’s a description of where my attention went. Balk is a Java server, a React client, and Postgres. On a normal day about thirty pull requests land. That number swings and doesn’t track features or big work. It’s just how the tooling decides to chunk the things I ask for. Writing the code is cheap. Changing it is cheap. Large refactors across the codebase seem effortless. So the cost moved. What is possible has changed.
Three things I believe that inform the rest
Tests are your intellectual property. Build your datasets. Label your complicated business cases. Make it easy to generate a vast number of test cases quickly. The tests are what let the code be cheap.
If the output is correct, it is correct. I don’t care what the code looks like. I care whether it does the right thing. If something about the code matters to you, measure it and gate it in CI.
All code is technical debt. Every line is a liability the moment it exists, and it’s subject to change at any time for any business need.
Proving the code is right is now my most important cost.
What feature gravity is
Feature gravity is the pull a feature exerts on everything that comes after it: the cost of every change it touches, every test it adds, every piece of context it occupies. Not the cost of writing it. The cost of owning it.
The name is borrowed from data gravity, where enough data in one place eventually drags the compute to it and the cloud-agnostic dream meets the S3 bill. Features do the same thing to a codebase. Enough of them and every new change is made in their field.
The older vocabulary gets close but doesn’t quite land anymore:
- Carrying cost (ReinertsenDonald G. Reinertsen, The Principles of Product Development Flow (2009).) is the ongoing cost of every feature you own, usually framed as maintenance and support labor. That’s the right idea, but maintenance and support mean something different now that the labor is partly a tool.
- Cost of change (Boehm, BeckBarry Boehm, Software Engineering Economics (1981); Kent Beck, Extreme Programming Explained (1999).) is how expensive it is to change the code. That’s the one that collapsed. I’m sure there’s still pressure there, but it’s nothing like a year ago.
Any discussion of technical debt or maintenance cost that hasn’t been revisited since the new coding tools arrived is describing a different world.
What one feature weighs
We have an onboarding flow. The feature is: you must fully explain the game to new users. That single sentence took on a ton of weight. Change a rule and a lesson gets rewritten. Almost every new feature has to interact with onboarding, or at least stop and consider whether it should. The onboarding flow is constantly reworked, and none of that rework is the onboarding flow’s fault. It’s gravity.
That’s the obvious example. The less obvious ones are in the pipeline.
Every pull request has to pass five checks before it merges:
| Check | What it covers | Size today | Typical run |
|---|---|---|---|
| ServerJava tests against a real Postgres | Java tests against a real Postgres | ~1,100 tests | 5¼ min |
| FrontendUnit tests, types, build | Unit tests, types, build | ~600 tests | 2½ min |
| BrowserWhole games played end to end | Whole games played end to end | 55 tests | 9 min |
| PicturesEvery screen compared pixel by pixel to an approved image | Every screen compared pixel by pixel to an approved image | 334 images | 5 min |
| ScriptsDeploy and release scripts | Deploy and release scripts | 4 suites | 1¼ min |
One full run of all five is a round. A round is the unit of cost, and every feature adds a variable amount of weight to it.
- The 334 pictures mean every visual change drags a round of re-approving images behind it. Gravity on the UI.
- The 55 browser games are the floor of the round: 550 seconds of a 9.8-minute round, and they only ever get longer. Each one is a feature’s weight you can read off a clock.
- The context window. Every feature is more that the tool has to load before it can touch anything. This is a carrying cost nobody was measuring two years ago and I don’t have a good number for it yet, but I can feel it. The bigger the thing, the more the agent has to know to change it safely.
None of this is the cost of writing the feature. It’s the cost of the machine that proves the feature still works, growing a little every time.
Measuring the machine
If a round is the unit of cost, then the pipeline is where feature gravity shows up as money, and that’s a thing you can measure and drive down.
We left GitHub Actions this month, for two reasons. One was a run of outages this year.GitHub’s availability reports: Actions jobs delayed or failed 9 July 2026, 03:29–13:39 UTC; github.com degraded by a DNS fault 19 July, 18:00–20:11 UTC; self-hosted and larger runners cut off 19–20 July, 23:05–03:55 UTC; ten incidents in April. github.blog The other was control: to run things more freely and to keep the bill down by being able to move clouds. What we built is a small fixed coordinator and workers rented by the second from a job queue, the same shape AWS documents for scaling on a queue’s backlog.“Scaling policy based on Amazon SQS,” Amazon EC2 Auto Scaling User Guide. docs.aws.amazon.com The coordinator holds the code, the queue and the results, and is always on and small. Workers are made when jobs wait, from a prepared image, and deleted after five idle minutes. With no work, there are none. Spend is capped in code. A release is built on the workers and goes live when a person presses Put live. This month the workers were DigitalOcean droplets. Next month, whoever is cheapest.
Round time, median wall clock
That last row is feature gravity in a chart. Nothing about the pipeline got slower between the 18th and the 22nd. The browser suite got bigger.
What a round costs: machine-minutes per round
Against GitHub’s hosted runners
- About 2× cheaper than GitHub’s 2-core runners and 4× cheaper than 4-core, both weeks.
- The bill fell 41% week on week ($32.32 → $19.06) on 21% fewer rounds (471 → 370): 6.9¢ a round to 5.2¢.
- Caveat: GitHub runs your own machines for free. The saving is against its hosted runners only.
- Caveat: 46% of what we pay runs no check. Billed time splits as checks 54%, tails 18%, boots 16%, idle 13%. Workers boot from a prepared image in 74 seconds, but we’re only getting 1.3 checks out of each one before it idles away, which is barely better than GitHub’s new-VM-per-job.GitHub Docs, “Using GitHub-hosted runners”: a new VM is provisioned when the job begins and decommissioned when it finishes. docs.github.com
Why machine-minutes per round rose while cost per round fell: the two measure different windows, and the first cost week carries the slow rounds of 12–13 October, so check time per round fell from 25.7 to 19.9 minutes between the two cost weeks even as the last four days’ rounds grew heavier than 14–18 October’s.
Where a billed minute goes, 15–22 October
We are nowhere near the bottom. Three browsers per machine are on trial. Reusing green results saves 1.9% on trunk alone and about a quarter of machine time if any green result counts. How many workers to keep warm, and for how long, falls straight out of the billed-time split above. One OpenTofu file per cloud: DigitalOcean is $0.00139 a minute today; Google Cloud spot lists $0.00064.Our price survey, October 2026, 4 CPU / 8 GB, list prices per minute; clouds that bill by the started hour left out.
What it costs to build the Alpha “MVP” of Balk
List prices, October 2026, before tax.Anthropic, “What is the Max plan?”: Max 20x, $200 per month. support.claude.comDigitalOcean list prices from our own records: the live server and backups (monitoring notes), the coordinator after its move, prepared images (about 15 GB at $0.06/GB each); workers from our borrowing record at October’s pace.
| Item | Per month |
|---|---|
| Claude Max 20x plan | $200 |
| Rented check workers (October to the 22nd: $53.83) | ~$77 |
| The coordinator: 1 CPU / 2 GB and its disk | $14 |
| The live site’s server: 1 CPU / 2 GB | $12 |
| Off-site database backups (object storage) | $5 |
| Prepared machine images for the workers | < $2 |
| Email (free tier) | $0 |
| Total | ~$310 |
The nice thing about “Feature Gravity” is we can turn it off. Our live site in theory can handle 2k active users based on our internal load testing. I know some flaws in that, but if we have 2k active users I have a business model that shows something very profitable to throw compute at. This feels like running a sub 30 second mile compared to a year ago. This feels like magic. What happened to the software engineers that liked to build? Message me if you want to build something. I love tinkering with computers.