Skip to content

v0.5.66

Choose a tag to compare

@github-actions github-actions released this 28 Sep 00:36
· 26 commits to main since this release

One change an operator will see, and three that repair things the repository was saying about itself.

An operator pause counts the turns in flight (#377)

When the relay consumed an operator pause request, the pause recorded a fixed evidence string:

advisor turn N of M; no turn is in flight

"no turn is in flight" was unconditional. True when the run was a lockstep round loop; not guaranteed with several seats. The pause request is consumed at the same dispatch boundary as the advisor budget check thirty lines above it, with no drain between them — and that budget check already has to ask outstanding() > 0, with a comment recording that this is the one place the answer is readable.

So an operator pausing a multi-seat run could be told nothing was running while sibling seats were mid-turn — as evidence, at the moment they were deciding how to answer. There was nowhere else to check it, because the pause is the surface that exists to tell them.

It reads the count now:

advisor turn N of M; no turn is in flight       when nothing is outstanding
advisor turn N of M; 1 turn is in flight
advisor turn N of M; 3 turns are in flight

The count rather than a corrected negation, because an operator deciding whether to abort wants to know how much is in flight, not merely that something is. Zero keeps the old sentence exactly, so a single-seat run reads as it always did.

The test for it did not exist — the defect was read from the code and never reproduced — and a test covering only the drained case would have passed against the bug. It is pinned now by a two-seat run paused with a sibling turn still outstanding.

RelayOptions.implementers says both front-ends set it (#376)

Its docstring said "Neither front-end sets it. There is no flag for it and adding one is a separate decision." Both set it, from --implementers, and the flag is in the help text.

Both false claims pointed the same way — at a field that is vestigial. "Nothing sets this, no flag exists" reads as dead and safe to remove, and it is the field --implementers writes on both paths.

The design note's inventory table names symbols, not lines (#372)

The concurrent-implementers note carried 53 bare :NNNN citations across 95 rows, and of the 19 rows with both a citation and a verdict, none resolved to the symbol it named. Repairing the numbers would have bought nothing: they are not pinned, relay.ts moved in three separate pull requests in one week, and they would have rotted again within days.

So the line numbers are gone rather than repaired. Symbol names stay, because a symbol stays greppable and a line number does not. The table head now says it is frozen record, that it names symbols deliberately, and that a verdict in it describes what was predicted.

Nineteen verdicts were audited against the tree and each says so — held, corrected, or still an open prediction. #runLoop is the one worth reading: the row predicted it would be replaced by a dispatcher loop, and what happened is that #runLoop survived and the dispatcher was built inside it. Wrong about the mechanism, right about the problem. The other 26 verdict rows are declared unchecked, because a row that looks audited and was not is the same defect as one that was guessed at.

A test that asked its question before the answer existed

the waiting state is said once, not every poll read a follower's stderr after a fixed 1,200ms wait. On the slowest runner in the matrix the notice had not been written yet, so a test whose entire purpose is to catch that line REPEATING failed for the line being ABSENT.

It waits for the notice, then holds the quiet window, then counts. The quiet is after the notice rather than instead of it.