The earlier acceptance ran for months with no single plan number; this one covered eighteen domains in a week, every row with a trace.

👋 Hi, I'm Anton - a software engineer. These days I work on a platform: contracts, generated code, data paths and the tooling around them. Running notes live on my GitHub: github.com/brilliant-almazov.

Everything measured here was measured on local test stands by the acceptance agent; the plan numbers, the run counts and the hooks are built and in use, and the four rows still open are named as open below.

This is part 1 of the series on one week of integration acceptance across a whole chain of services, after months of doing it the slow way. Maybe you already do it better, maybe you'd do it another way - this is how it went, and where it stops.

In real life

The whole system is a zoo. The services are the residents, the bus is the paths between the enclosures, and acceptance is the vet - Pickle, a guinea pig with a notebook, who walks round and writes down who is well and who is not. Nora is the keeper; she does not treat anyone, she hangs signs.

For months Pickle walked round the zoo without a list. Every morning a round, every evening a note: "round one hundred, most residents fine". Nora asked the simple question - "Who is well, then?" - and Pickle said "Most of them. I think." Pip, the guide, said what everyone was thinking: "Most is not a number."

So Pickle got a card for every enclosure. Eighteen cards. On each card, every check that enclosure needs, one line per check, and next to each line a photo of the paw that proved it. Miso the cat looked at hers and said: "Mine says nap: tested." A week later Nora asked again, and this time the answer was a number, with a photo behind every line of it.

A four-panel comic: Pickle, bored, says round number one hundred, and Nora, worried, asks who is well then; Pickle says most of them, I think, and Pip says most is not a number; Pickle says one card each, eighteen, next to a notice board, and Miso says mine says nap tested; Nora asks in a week, and Pickle, proud, says with a photo of every paw, next to a sign reading all 18 checked

The cards are the acceptance plan. An enclosure is a domain of the plan. A line on a card is a plan row. The photo is a trace - the record of the real request that proved the row. And the difference between the two halves of the story is not that the vet got faster; it is that the vet got a list.

Then: months, runs, no number

Before this week there was an earlier acceptance - the earlier acceptance of the rules service. It ran for about three and a half months, from late July to early November, and in that time it went through 149 runs, on production surfaces and on earlier stands.

It was not lazy work, and it found real things. But it had no single plan number that could be compared with anything. Progress was tracked per version and per case: this version, these cases, these results. You could ask "is case X passing on version Y" and get an answer. You could not ask "how much of the whole thing works" and get a number, because there was no whole thing written down as one list.

That acceptance set has since been moved out of current acceptance, into an archive; its history is kept. I mention it only as the "before" picture, and I keep its numbers as they are: months, runs, no percentage.

Columns: then, about 108 days; now, 7 days; Pickle, proud, says same vet, a list this time; pills read then 149 runs, no plan number, and now 18 domains

Now: one week, eighteen domains, one plan

The second acceptance covered a whole chain of services around the data-collection system: tasks created upstream, a queue, the collector, its emulated providers, the result bus, result processing, storage of request bodies, alerts and control switches. The acceptance plan for it is split into eighteen domains - eighteen enclosures - and each domain is a list of rows.

A row is one checkable behaviour. It passes or fails on a live stand, and when it passes, the verdict carries the trace id of the request that proved it. Every verdict is checked on two local stands. The next part of this series walks one row through all twelve of its stops; here it is enough to say that a row is not a function call, it is a request that crosses services, a bus and several stores.

A dark card with one plan row as a form: domain, one of 18; row, domain and number; verdict, passing, failing or not a subject; trace, the trace id of the request that proved it; build, the live build it was measured on; the highlighted line reads not a subject only with the owner's words that name this row; a pill reads built

The result after one week, in the plan's own words: 749 of 753 rows pass, 99.5 %. Four rows are still open, and all four sit in one domain - the gathering on the emulator, the one enclosure whose card is not all green yet. Why it stays under a hundred, and whose bugs those are, get their own parts in this series.

A donut: 99.5 percent, 749 of 753; legend: passing 749, still open 4; Pickle says four to go, I know which; a pill reads measured, every row with a trace

The number moved, and so did the denominator

Here is the part that is easy to get wrong when you read a "41 % to 99.5 %" headline, so I give all three counts as the plan recorded them:

When Rows passing Rows in the plan Share
the first full count 288 700 41.1 %
four days later 713 786 90.7 %
the last day 749 753 99.5 %

The bottom of the fraction moved twice. It grew, because new behaviour got new rows - new control calls each came with their own plan rows. And it shrank, because synthetic rows left the scope. That second move is the dangerous one: a plan that drops its failing rows will reach a hundred per cent without anything getting better.

So the rule for a row leaving the scope is strict, and it is the owner's rule: a row is "not a subject" only with the owner's words that name that row. Every row that left the scope in this week carries its quote. That rule was not always held. On a few runs, rows were taken out of scope on a coordinator's decision, backed by a generic quote from the owner that did not name them. That was written up as a mistake, and it became a hook in the rules repository - the shared skills and hooks every agent session loads.

# out-of-scope-needs-owner-quote - what it refuses (paraphrased) a plan row marked "not a subject" without the owner's words -> refused with a generic owner quote -> refused: the words must name the row with the owner's words naming this row -> accepted 

Bars: the first full count, 288 of 700, 41.1 percent; four days later, 713 of 786, 90.7 percent; the last day, 749 of 753, 99.5 percent; Nora, proud, says every row out of scope has my words; pills read measured and the scope moved by the owner's word

What made the week possible

Three things changed between the two halves of this story, and none of them is "the vet worked harder".

A list. The plan exists as rows grouped into domains, so "how much works" has an answer at any moment. The earlier acceptance had cases and versions; this one has a denominator.

A trace on every row. A verdict without proof is an opinion. A verdict with the trace id of the request is something anyone can open and check, and something the next run can compare against.

Every push on the stand at once. The rules repository wrote this one down the same week: a pushed build used to wait for green CI before reaching the test stand, and acceptance ran on a stale build. Now every pushed commit goes to the stand at once, and a report is accepted only on the latest live build. The gain, in the rules repository's own words: no acceptance cycles wasted on old builds.

# how a fix reaches a plan row this week (paraphrased) push -> the stand gets the build at once, CI runs alongside stand -> the build becomes the live build acceptance -> reruns the rows touched by the fix, on the live build verdict -> passing | failing, with a trace and the build it was measured on plan -> the share is recounted; rows out of scope only by the owner's words 

An animation: a parcel travels from a push to the stand, to a row that gets a trace, to the plan, and the tiles light up one by one; the last pill reads the plan moves by one row

The sign on the door

Every part of this series ends in the zoo with Nora hanging a sign. This one hangs at the vet's door, and it is the shortest summary of the week.

Nora, proud, waving next to a big sign reading every row has a trace and a live build; Nora says a card for every enclosure, and a photo on it; on the right the mechanism: pushed-sha-goes-to-deploy, qa-report-on-latest-live, out-of-scope-needs-owner-quote, a trace on every row; a pill reads built

What went wrong

The earlier acceptance was not wrong in what it checked; it was wrong in what it could not say. Three and a half months of runs produced verdicts per version and per case, and no single number anyone could point at. And in the new week, the one real slip was in the denominator: rows left the scope on a decision that quoted the owner in general rather than about those rows. A plan that can shrink its own bottom line without a named reason is not a measurement.

Before and after: the earlier acceptance, 3.5 months, 149 runs, no number, per version, per case; this week, 1 week, 18 domains, 99.5 percent of 753 rows, each with a trace; a pill reads measured

What I do not claim

  • Not that the two acceptances are the same size. They covered different services; the comparison is about method - a list and a number versus none - not about effort.
  • Not that code coverage jumped. The collector's own measurement of its code coverage stayed at about two thirds through the week; what jumped is the acceptance plan, from 713 of 786 to 749 of 753.
  • Not that 99.5 % means done. Four rows are open, in one domain, and some of the reasons sit in other services.
  • Not that this was tested anywhere but local stands.

What of this is method

  • A list before a number. Without rows written down as one plan, "how much works" has no answer.
  • A trace behind every verdict. Proof that anyone can open turns a status into a fact.
  • The denominator is guarded. A row leaves the scope only with the owner's words that name it.

Eighteen domains in a week - Part 1. Next: One Row, Twelve Stops.

If your acceptance runs per version and per case, can you say how much of the system works as one number? If you already keep a plan with a percentage, who is allowed to take a row out of it? If your verdicts carry a trace, how often does anyone open one? What does your vet's list look like?