Skip to content

A15/A16 remainder: the six named drifts were already landed (#3665/#3696/#3697) — this pins the three that had no pin: get_ag_health names its reader's traps, the catalogue's duration-trend line says rates not percentiles, server-tabs.js reads the Stamped tools by captured_at (#3653) - #3801

Merged
erikdarlingdata merged 1 commit into
devfrom
fix/3653-a15-description-remainder
Sep 20, 2026

Conversation

@erikdarlingdata

Copy link
Copy Markdown
Owner

The lie

Item 17 of #3653 (A15/A16, description drift + envelope vocabulary) still listed six drifts as open after #3793: audit_config claiming edition-awareness and answering no_config_data for a PostgreSQL target; plan top_operators silently Take(10) and switching its ranking basis; missing_indexes.impact an unlabelled statement-scoped percentage; get_ag_health hiding its reader's two documented traps; the web catalogue calling the query duration trend "percentiles"; and server-tabs.js reading the four StampedUnderCollectionTime tools by the old key. Read at source on dev 32096b62, all six were already delivered — by #3665 (the not_collected envelope), #3696 (the other five descriptions and the plan formatter), and #3697 (the JS tile). The item text was stale, not the work.

What was NOT delivered was the pin. Three of the six fixed texts had nothing holding them: the AG description's two trap sentences, the catalogue line's "not percentiles", and the Sessions tile's captured_at read. Each is a fix that fails nothing when it regresses — a description tidy drops a sentence and the reader's doc comment goes on being right in a file no agent opens; a catalogue edit reintroduces a word no payload backs; a JS key drifts back and the tile renders a dash where the snapshot's age was, still drawing, still "working". This PR is those three pins, and nothing else changes on the wire.

Mechanism, per pin

DarlingMcpAgToolsSurfaceTests.Description_SurfacesTheReadersTwoDocumentedTraps. Anchored first on DarlingAgReader's own bolded paragraph headers (<b>Latest collection per server.</b>, <b>What the badge deliberately does NOT band: lag and queue depth.</b>), so the pin fails with "re-anchor" if the reader stops documenting a trap rather than passing against prose that no longer exists. Then the description, for each trap's mechanism, consequence and tell: the collectors write NO row for a server with no AGs → last non-empty snapshot → collection_time; lag and queue depth are NOT banded → secondary_lag_seconds → is_suspended and the DMV's 0 lag while data movement is suspended. Then the instructions' AG paragraph, which carries the same two in its own words beside the perspective trap (LOCAL-replica-only columns) it always had.

DarlingMcpTrendToolsSurfaceAndSqlTests.QueryDurationTrend_CatalogueLine_NamesTheRatesThePayloadCarries_NotPercentiles. Both ends. The catalogue line (DarlingWebEndpoints.CatalogDescriptors["get_query_duration_trend"]) must name ms/sec and executions/sec and say not percentiles; SerializeTrend — the helper the duration trio shares — must still project elapsed_ms_per_second = p.Value and executions_per_second = p.ExecutionsPerSecond and contain no "percentile"; and across the whole catalogue the word may appear only negated ((?<!not )percentiles? matches nothing), because no read here computes one. A read that genuinely returned a percentile would add itself beside that sentence rather than fall through it.

ServerPageTabsTests.TheStampedReads_AreReadByTheirStamp_NeverTheRetiredKey. Derived, not listed. The roster is McpLatestSnapshotStampTests.LatestTools filtered to Stamped and SearchBound — every read of those shapes publishes its stamp once at the top as captured_at and nothing under collection_time anywhere in its payload (the census's negative sweep refuses the top-level key, and none of those fifteen tools projects the word into a row either), so any descriptor the page binds to one of them that names key: "collection_time" is a dead read, tile or column alike. The page side is parsed by bracket balance: every stat(…), table(…) and fanout(…) call, its first read-shaped literal, and every *_STATS / *_COLUMNS token in it, resolved to the module's top-level const NAME = [ … ]; arrays. Twelve bindings over the roster are examined today; the four reads the item named must each be reached or the test fails on the parser rather than passing on nothing. Windowed reads are excluded on purpose: get_memory_grants / get_resource_semaphore rows carry a per-row collection_time that IS a series column. The positive half is the one tile the item named — SESSION_STATS must show { key: "captured_at", label: "Collected", format: "reltime" } — so the pin cannot pass by the tile being deleted.

Why this shape

Pins only, no prose edits, because every sentence the item asked for was already on the surface and re-wording a correct description to "own" it would be churn on the wire an agent reads. The AG pin is phrase-matched rather than paraphrase-tested because these are the exact words a caller searches a description for. The JS pin is derived from the stamp roster rather than naming the four reads, so a fifth read joining the roster is covered the day it joins — the four are asserted as a reach check on the parser, not as the population.

What this does NOT do

Verified here

Builds -c Release -p:EnableWindowsTargeting=true, 0 warnings: PerformanceMonitor.Darling.Viewer, PerformanceMonitor.Darling.Service, Darling.Tests.

Darling.Tests through a Darling.Tests-named net10.0 harness on this Mac (the whole test tree compiled against the built dlls):

  • The three new pins red against their defects, then green: the AG description with the lag and queue depth are NOT banded sentence removed → red on that phrase; the catalogue line reverted to Query duration percentiles over time. → red on ms/sec and again on the whole-catalogue sweep naming get_query_duration_trend; the SESSION_STATS tile keyed back to collection_time → red naming get_session_stats/SESSION_STATS and the retired key. All three green on the head.
  • Censuses green: RepoFileAdoptionTests, McpPageContractTests, McpPayloadContractCensusTests, MeasurementContractCensusTests, FactSourceRegistryTests, DocCommentHygieneTests, McpLatestSnapshotStampTests; the three host classes in full (ServerPageTabsTests, DarlingMcpAgToolsSurfaceTests, DarlingMcpTrendToolsSurfaceAndSqlTests).

First executed in CI: nothing on this surface — every changed assertion ran here.

Partial #3653 — item 17 (A15/A16)

…ption names its reader's two documented traps, the web catalogue's duration-trend line says rates and never percentiles, and server-tabs.js reads every Stamped tool by captured_at (partial #3653 A15/A16)

The six drifts item 17 still listed were all delivered before this branch (#3665, #3696, #3697); three of the fixed texts had nothing holding them. Pins only, no wire change:

- DarlingMcpAgToolsSurfaceTests.Description_SurfacesTheReadersTwoDocumentedTraps anchors on DarlingAgReader's own bolded paragraph headers, then holds the description and the instructions paragraph to each trap's mechanism, consequence and tell (NO row for a server with no AGs / last non-empty snapshot / collection_time; lag and queue depth NOT banded / secondary_lag_seconds / is_suspended / 0 lag while suspended).
- DarlingMcpTrendToolsSurfaceAndSqlTests.QueryDurationTrend_CatalogueLine_NamesTheRatesThePayloadCarries_NotPercentiles holds the catalogue line to ms/sec + executions/sec + 'not percentiles', SerializeTrend to the two rates it projects, and the whole catalogue to 'percentile' only ever negated.
- ServerPageTabsTests.TheStampedReads_AreReadByTheirStamp_NeverTheRetiredKey derives the Stamped + SearchBound roster from McpLatestSnapshotStampTests.LatestTools, slices every stat/table/fanout call by bracket balance, and refuses key: "collection_time" in any descriptor array bound to one of them; the four named reads must be reached; SESSION_STATS must show captured_at.

Each red against its defect, then green, in the Mac harness.
@erikdarlingdata
erikdarlingdata merged commit 805ec01 into dev Sep 20, 2026
4 of 7 checks passed
@erikdarlingdata
erikdarlingdata deleted the fix/3653-a15-description-remainder branch September 20, 2026 16:03
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