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.
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.
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.
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.
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 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 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.
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.
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?









