Skip to content

A "read by nothing" pin cannot outlive the readers it was waiting for: the V137 eight-column no-reader census is retired whole rather than exempted file by file — #3814 released the clause forty minutes after the rung, #3821 bought one merge by name, and #3796, #3712 and #3783 were each about to red the same method and race to edit it - #3825

Merged
erikdarlingdata merged 1 commit into
devfrom
fix/v137-retire-no-reader-pin
Sep 20, 2026

Conversation

@erikdarlingdata

@erikdarlingdata erikdarlingdata commented Sep 20, 2026 •

Copy link
Copy Markdown
Owner

Dev went red at 20215a4 on one fact, QsCaptureModeRouteKnobToastRungTests.NoReaderNamesAnyOfTheEightColumnsYet, in build, Darling PostgreSQL tests and Darling whole-tree guards. #3821 (6163165) patched it green by exempting two files. This PR retires the fact instead, because the thing it pins stopped being true the hour it merged and every consumer merge since has had to edit the same method body to get past it.

While this PR sat in CI the race it describes ran to completion: #3822 (fence on the clutter reader/judgment files) and #3823 (#3796's code half — renamed the fact to NoReaderNamesAnyOfTheSixUnconsumedColumnsYet_AndTheCaptureModeConsumersNameBoth and inverted arm (a) to a positive scan) both merged to dev and both landed inside the method. The rebase conflicted exactly there; the resolution is the same deletion over dev's version of the file (all of #3822's and #3823's hunks in this file were inside the method — nothing outside it was touched by either).

Mechanism

The V137 rung (#3813, f2e1816) added eight nullable columns on three existing tables and shipped with the exit criterion's last clause pinned: no product source in the five Darling/Analysis projects names any of the eight column names, comments stripped, so that each consumer lane would have to release the clause deliberately. The pin scans every *.cs file and throws on the first hit.

A "no reader names the column" census has one honest lifetime: from the rung's merge to the first consumer's merge. Here that was forty minutes. #3814 (#3797's Query Store clutter view, merged 17:56Z) publishes query_capture_mode = (string?)null beside capture_mode_known = false — the payload KEY, a promise that the column exists and is not yet read, not a read of it — and names the key in DarlingMcpInstructions.cs. The census cannot tell a pointer from a reader; it saw the literal and failed.

What failed, quoted

From the dev run at 20215a4 (Darling PostgreSQL tests, 18:01:40Z; identical in Darling whole-tree guards at 18:09:21Z):

Darling.Tests.QsCaptureModeRouteKnobToastRungTests.NoReaderNamesAnyOfTheEightColumnsYet [FAIL]
  D:\a\PerformanceMonitor\PerformanceMonitor\Darling\PerformanceMonitor.Darling.Service\Mcp\DarlingMcpInstructions.cs names query_capture_mode: a consumer landed — retire this pin's arm for that column deliberately (and, for (b), the rung doc's 'written by nothing and read by nothing' clause).
    Darling\Darling.Tests\QsCaptureModeRouteKnobToastRungTests.cs(476,0)

Reproduced on this Mac with the 20215a4 version of the test in the in-process harness against the current tree: same file, same column, same line. (The f2e1816 red one run earlier was the other V137 residue — Lite.Tests.TimeHonestyRungReadTests.AV62Database_ClimbsToV63_AndItsOldRowsReadNull — also fixed by #3821; the census was green there because #3814 had not landed yet.)

Why retire, not patch

#3821 exempted DarlingMcpQueryStoreClutterTools.cs and DarlingMcpInstructions.cs by name and added a positive arm holding the clutter tool to the null placeholder. That is the right shape for a homonym (the toast_bytes on pg_table_bloat_stats the pin already carved out) and it made the tree green, but it fixes the census against one consumer while three more are in flight, all of them the readers the rung was built for:

Each would red the pin on merge, and each would have to edit the same method body — a three-way conflict on a test whose only remaining job is to be edited. #3796 did exactly that (#3823, merged 18:3xZ): its edit to this file is the method and nothing else. A "read by nothing" pin cannot outlive the readers it was waiting for.

The positive ownership pins — which reader names which column, and what it publishes — belong in those lanes' tests, and for the two consumers that have landed they are already there and stronger than a name scan:

What this rung test owns is the DDL shape, the ladder, the probe, the two writers and the Lite twin; the consumer roster was never its to keep.

The method and its <summary> are deleted, and the class doc gains one paragraph recording the history in the file's voice: merged with all eight columns read by nothing (true at f2e1816), released the same hour to #3797's clutter reader (#3814) and the three code halves, three PRs (#3821, #3822, #3823) editing the one method body inside an hour, positive pins named where they live. The class doc's "This file is the RUNG: …" sentence drops the clause it no longer carries.

What this does NOT do

Tests

Darling.Tests builds -c Release -p:EnableWindowsTargeting=true with 0 warnings. Executed in-process on this Mac (xunit v3, the mactest harness over the built dlls):

One test file, −133 / +26 lines against dev at 194824d.

Which component(s) does this affect?

  • Darling Tests

Checklist

  • I have read the contributing guide
  • My code builds with zero warnings
  • No hardcoded credentials or server names

Follow-up to #3813 (V137 rung); unblocks #3796, #3712, #3783 code halves.

@erikdarlingdata
erikdarlingdata enabled auto-merge (squash) September 20, 2026 18:34
…: the V137 eight-column no-reader census is retired whole rather than exempted file by file — #3814 released the clause forty minutes after the rung, #3821 bought one merge by name, and #3796, #3712 and #3783 were each about to red the same method and race to edit it (follow-up to #3813)

QsCaptureModeRouteKnobToastRungTests.NoReaderNamesAnyOfTheEightColumnsYet
scanned the five product projects, comments stripped, for the eight V137
column names and threw on the first hit. Dev red at 20215a4:

  DarlingMcpInstructions.cs names query_capture_mode

capture_mode_known = false — a pointer, not a read — and the census cannot
tell the two apart. #3821 exempted the two files and added a positive arm;
green, but the three code halves the rung exists for name the columns in
product source outside any exemption (measured: #3796's pushed branch,
edit to the method. Three lanes editing one test body whose only job left
is to be edited is the race, not the fix.

The method and its summary go; the class doc records the history in the
file's voice; every other fact stays byte-for-byte, including the (d)
no-WRITER arm on StoreSelfMetrics.cs inside the dimension-sweep fact (one
file, one lane, #3783 retires it with the row). WithoutComments stays for
that arm. No product file touched. Lite.Tests/QsCaptureModeRungTests has
no reader-roster fact to retire.

Darling.Tests -c Release -p:EnableWindowsTargeting=true: 0 warnings.
In-process on this Mac: the class 6/6; the 20215a4 version of the class
in the same harness fails exactly the quoted fact; RepoFileAdoptionTests,
DocCommentHygieneTests, CommentFilterAdoptionTests and the census list
green.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant