One of the session write-ups in my repo opens like this:

Session ended with a revert and nothing shipped.

It is written as a confession. Nothing shipped is the normal state of a session, and it always has been.

What shipped means

On a branch, it is a draft. On main, it is merged. It is only shipped when it has a version tag.
Nothing else counts.

I keep that narrow on purpose. It is the only line in the whole process where the cost of being wrong changes, and everything either side of it behaves differently.

Before the tag

A mistake costs my time. That is all it costs. I can flip the shape, throw out the file, ask a different question and start again, and nothing outside the tree notices any of it.

After the tag it costs the time of everybody who took the tag. The same edit, priced differently, because something out there now depends on the answer I gave.

So a commit is a save point. Main is more than that - it is the base everybody else works from, and breaking it stops other people instead of me. It is still not shipping.

The cost goes up in steps. On my own branch a mistake costs my time; on main it costs whoever pulls it. After the tag it costs whoever took the version, and that is the step that does not go back.

Work that gets thrown away

Which makes discarded work cheap, and it was never waste in the first place.

I let a proposal arrive and then ask what it is for. A shape I throw out has already told me what was assumed while it was being built, and that is not something a specification recovers, because a specification is me guessing the assumptions in advance. The proposal is the information. Some of it goes in the bin and it has already paid.

That is the part that reads as loss and is not.

It used to be expensive

None of this is new to me. incus-compose is on its third architecture, and I threw away the first two by hand, at a price I paid in evenings.

What changed is not the method. It is the price of the arithmetic. Writing a version out has got cheap enough that being wrong in one costs almost nothing, and the only thing that stayed expensive is deciding which one to keep.

The wrong scoreboard

The write-ups book every discarded round under “where I cost you time”. Rounds that never landed, files deleted before they were read, a whole session that ended in a revert. All of it scored as loss, against shipping, which is not something a session can do.

One of them caught itself by accident. A detour it had written up as wasted was what made it understand a path well enough to find a real bug later, and it filed that under luck.

It was not luck. It was the method, and the accounting is wrong, not the day.

The only line that costs

Everything before the tag is thinking with a compiler attached. It compiles, it runs, the tests go green, and none of that makes it shipped - it makes it a draft that executes.

The tag is where it leaves my hands. Main is where it leaves my branch, and that deserves care too - the difference is that main is recoverable and a version is not.

It is also where the pleasure stops. Throwing a shape out and starting again is the part of this I would do for nothing, and a joy somebody else pays for is not a joy. Past the tag, somebody else is paying.


By René Jochum. License: CC-BY-4.0.