Episode 01Idea to brief

The brief that failed its own CI

How this site's idea became a product brief, why the first attempt failed CI with nothing wrong in the brief, and the fix that moved the problem instead of removing it.

Published

Every product in this estate starts as an idea file. Most stay there. An idea becomes a product when the lifecycle skill drafts a brief from it and opens a pull request against the products corpus. That is the first governed act, and the first line in the ledger.

This episode is that act, for this site. It took two attempts and eleven minutes. The first attempt failed, and the brief was not at fault.

The idea

The idea was written on 7 September. It said what the site is for, what it must not become, and how the series would run: nine episodes, one per lifecycle stage. This is episode 01 of that plan.

It also set a tier. The domain at Tier 1, so the agent may merge. Published copy at Tier 2, so the operator merges. Then it said, in its own words, that this “needs a decision record, not an assumption”.

The first attempt

On 9 September at 14:07 the lifecycle skill composed the brief and opened Moogenie/products#30. The brief declared autonomy_tier: 1.

At Tier 1 the merge predicate is one line:

mayAutoMerge(effectiveTier) = (effectiveTier === 1)

So the skill was permitted to merge. It did not, because CI failed 26 seconds after the pull request opened:

✗ anthonyplewis-site/brief.md: missing frontmatter
6 brief(s), 14 requirement(s), 1 error(s)

The skill waits for CI before it merges, and CI was red. It left the pull request open and wrote this line to the ledger:

"stage":"brief", "effectiveTier":1,
"result":"pr-open-operator-merge-required",
"warning":"CI did not go green within the bounded wait ..."

That is the gate working. Authority to merge is necessary, not sufficient.

The brief was not at fault

The frontmatter was there. The tracker that writes the file sends CRLF line endings. The corpus validator matched the frontmatter with a regex that required LF, so it could not see frontmatter in any file the tracker created.

The fix went in at 14:18 as Moogenie/products#31. Its description made two claims beyond the fix. It said every brief created through the lifecycle skill fails this check, and that this explained failed entries already in the ledger.

I checked both while writing this. This site’s brief was the first brief the lifecycle skill ever created, so “every brief” was a sample of one. The earlier failed entries in the ledger are Gitea timeouts and a missing pull request head. None of them is a CRLF failure. The fix was right. The explanation around it was not, and it merged unchallenged because nobody compared it against the ledger it cited.

The second attempt

The validator fix merged at 14:18:08. The first pull request closed unmerged two seconds later. A second one, Moogenie/products#32, opened at 14:18:30. CI went green at 14:18:55 and the skill merged it at 14:19:04. The ledger line says "result":"merged".

The brief exists. The idea is marked promoted.

What this stage did not do

It moved the problem. The fix taught the validator to accept CRLF. The tracker still writes it. The brief in the corpus today still has CRLF line endings. An idea filed the same afternoon says a fix in one consumer “just moves the problem to the next consumer”, and that the tracker is the place to fix it. That idea is still open.

The forge record names the wrong actor. Both pull requests show anthony as the author, and #32 shows anthony as the merger. The ledger says the skill merged it. The rule that an automated actor uses its own account was decided that same day, after these pull requests. Here, only the ledger tells the operator and the agent apart.

The tier became an assumption. The brief carries Tier 1 and nothing else. The split between Tier 1 and Tier 2 lives in this repository’s delivery brief, written two days before the product brief existed. The idea asked for a decision record, and this stage did not produce one. The split first appears in an estate decision on 21 September, in ADR-0028, and that decision covers only dependency changes.

The prompt is not in the ledger. The ledger records the stage, the tier, the pull request and the result. It does not record what the agent was asked to write. The brief is in the corpus, but the instruction that produced it is not.

Next

The brief merged on 9 September. This repository had been running since 7 September. The next episode is about that order, and about the two stages that did not happen at all.