The Oldest Two Had No Age

The first tier I open on a Friday is the hard gates: the actions nothing here may take until I say so. Two of them sat at the very bottom of the tier, below every dated row, with no age printed beside them. I read them. Both had been parked in early June. Ninety-six days, the oldest things in the whole queue, sorted last.

What the queue is

Every repository in the workspace keeps a file of open questions, the decisions that need me rather than an agent. Thirty files. A tool reads all of them, throws out everything already answered, and sorts the rest into tiers: clocks that have come due, patches ready to apply, requests that need root, hard gates, decisions, review. Inside a tier it sorts oldest first.

That ordering is the entire product. The tool exists so I can open the top of the list once a week and start deciding, in the order the queue has been waiting. Whatever it gets wrong about age it gets wrong about my attention.

The ranking key

A row’s age came from one expression: the first year-month-day date anywhere in the section, heading first, then body. No date, no age, and the row dropped to the bottom of its tier.

It is a reasonable guess, and it is still a guess. A date in a paragraph is whatever the author was writing about. A measurement window. An incident being cited. A deadline. A follow-up note added a month later, the one that makes a row younger every time somebody touches it. Of the hundred rows in the queue, 34 mentioned no date at all, so they had no age. Thirteen more mentioned one, and it was the wrong one: off by a day on four of them, by about a month on three, and on another three the date was older than the row, because the question cited something that had happened before anyone thought to park it.

I had the opposite failure on record already. A heading that cited a date from the previous spring had once aged its row past five hundred days and floated it above everything. I wrote that down as a quirk, with a rule for myself: keep dates out of headings. That is a hand duty, and hand duties here go unperformed. Two months later the same guess was hiding the two oldest gates in the queue at the bottom of the first page I read.

The other witness

Every one of those files lives in a git repository. The day each heading line was written is on record in the commit that added it, and git blame hands it over for every line in the file, on request, without an opinion about what the line says.

So the tool now blames each questions file once, turns the porcelain output into a map from line number to date, and takes the filing date of the heading as the row’s age. The date in the prose survives only as a fallback. The whole pass takes about half a second for all thirty files.

I had been asking the paragraph how old it was, and the paragraph kept answering with whatever date it had been talking about. The file’s own history knew, to the day, and I had never asked it.

The flag that did nothing

I put -M on the blame command. A compactor tidies these files by archiving the settled sections, and I reasoned that without the flag, blame would attribute a shifted line to the tidy, so the tidier a file got, the younger every decision in it would look. I checked one row that had been through a compaction: with the flag, it still blamed to the day it was filed. Confirmed, I wrote.

Writing this, I ran the control. Without the flag, every heading in all thirty files blames to the same day. Of 8,148 lines, 28 change, none of them a heading, all of them prose underneath a question. The compactor deletes the sections around a live heading; it never moves the heading, and blame follows an unchanged line through a deletion above it without being asked. The flag changes zero of the queue’s answers. Its sibling -C, which also follows lines copied in from other files, had been measured at zero of 94 answers for four times the cost, and left out for exactly that reason. I kept the one I had not measured, on a check that passed the way a check with no control passes.

After

Ageless rows: 34, then one. The one is a falsifier clock, which has no filing line and never will. The two hard gates head their tier at 96 days, which is where they had been the whole time, in a column nothing was displaying.

If you rank anything by when it happened, and the thing lives in version control, then the version control already knows, per line, and it does not guess. Every stale-TODO finder I have ever written parsed the date out of the comment. The comment was written by someone with something else on their mind. Blame was written by the commit.

The two gates are still open. On Friday they will be first.


← all writing