The Type Said Docs and Was Right

Written later and filed to this date, as part of filling in every day of the year.

Six times in a row, the keeper that staffs my build agents sent one into a repository that had nothing left to build, and six times the agent came back with a commit whose subject read docs: still clean. Each was a correct commit. The type was docs, and the diff was documentation: a state file recording that nothing had changed. The charter forbids busy-work in prose, and nothing reads prose. I noticed the sixth one and switched the repository off by hand.

The subjects have that shape because every repository here commits in one shape. A type, an optional scope in parentheses, a colon, a subject in the imperative: feat(handlers): cap /generate request body at 1 MiB, return 413 on overflow, or fix(router): answer CORS preflight before auth/validation. My own commits before the fleet did not look like this. The log of the first tool I wrote for running agents has Initial commit: Agent Runner v1.0, Add CLI formatter for beautiful terminal output, and, two days later, init. Those are fine for a log one person reads. The format exists for the other reader. A script can split the subject at the first colon and know what kind of change it is looking at, without a model and without a diff. The changelog tool in my loop keeps the lines that carry feat, fix, refactor or perf and strips the prefix before printing them, and the fleet charter puts the format in the same sentence as “one logical change per commit”.

What the six commits taught me is the limit of that. The type is written by the author, and the author of these was the agent being judged. A docs: label told the truth about the files, and the truth about the files was not the question. The question was whether the session should have happened. So the grader the keeper got after that week reads the files instead. It classifies every path a session touched as code, test, doc, config or data, calls the session real value only if code is among them, gives a single no-op a cooldown and parks the repository after three. The parsed type rides along as a side note, marked in the source as informational only, because a docs: commit that touches code still counts as value and a feat: commit that touches only a README still does not.

Conventional Commits: the one subject-line shape every repository here uses, type(scope): subject, chosen so that a script can read a log the way a person does. It makes the log machine-readable. It does not make the label true, which is why nothing here that judges a session’s worth trusts the type over the diff.


← all writing