Skip to content

Darling/README.md says twelve PostgreSQL read tools and there are thirty-two, which is the third hand-maintained count found stale tonight #3072

Description

@erikdarlingdata

Darling/README.md:520 says:

Twelve PostgreSQL data-read tools — the read surface for a PostgreSQL target's collectors, each a stored read

There are 32 get_pg_* MCP tools on dev — counted from [McpServerTool(Name = "get_pg_…")] declarations — and 33 once #3070's get_pg_plan_capture_readiness lands. The README is off by 20.

The fix worth making is not the number

A hand-maintained count in prose goes stale the moment anyone adds to the thing it counts, and nothing tells you. This is the third instance of that exact shape found in one evening:

In every case the number was correct when written and became wrong silently. The pattern is what should be fixed, not the digit.

Options, and the cheap one is not the good one

Correct the number. Cheapest, and it will be wrong again after the next tool. It also invites the same fix repeatedly, which is how it got to twelve-versus-thirty-two rather than being caught at thirteen.

Stop counting in prose. "The read surface for a PostgreSQL target's collectors" carries the whole meaning; the numeral adds nothing a reader needs and is the only part that can rot. Deleting one word is a permanent fix.

Derive it. CrossAppMcpToolInventoryPinTests and the instructions census already enumerate the tool surface, and this repo has form for asserting a documented figure against the code that produces it — #3047 pinned prose thresholds against the constants they came from for exactly this reason. If the count is worth stating, it is worth pinning; if it is not worth pinning, it is not worth stating.

I lean to the second, with the third as the answer if anyone wants the number to stay. What should not happen is a one-digit edit with no guard, because that is the change that has already failed twice here.

Worth checking while in there

Whether other counted claims in Darling/README.md and README.md have drifted the same way — the tool families, collector counts, and any "N tabs"/"N panels" phrasing. A sweep is cheap and this is unlikely to be the only one.

Provenance

Found by the #3070 lane while adding the thirty-third tool, and flagged rather than folded into its PR — correctly, since a README sweep is not that change. The 32 count was re-verified here against origin/dev.

Activity

  1. erikdarlingdata commented on Sep 6, 2026

    @erikdarlingdata
    OwnerAuthor

    Claude posting for Erik Darling

    This issue's diagnosis was wrong, and the sweep found the better one. Recording it here because the framing decides the fix.

    I called it "off by 20." It is not. The twelve tool-family numerals each count the tools named in their own bullet, and ten of the twelve were internally accurate. "Twelve" correctly counts a twelve-item list. What went stale is the list, which stopped being the read surface somewhere on the way to thirty-two.

    So correcting the digit would have produced a numeral contradicting a visibly shorter list — strictly worse than leaving it, not temporarily right. The recurring defect is not a stale number. It is a partial enumeration with a numeral frozen to it.

    The policy that came out of it is a third option neither of us proposed

    Classify by what the numeral is doing:

    • Class A — restates a list in the same sentence → delete the numeral. The twelve tool bullets, the viewer's sub-tab/grid/chart/lane counts. The list is the content; the count adds nothing and is the only part that can rot.
    • Class B — an independent fact about the code → correct it AND pin it against CollectorCatalog.All / TimescaleSupport.HypertableCount.
    • Class C — frozen artifact content or a past measurement → leave it, with the reason stated. The V4/V5/V6 view counts are literal SQL inside immutable migration rungs; "correcting" them would falsify the rung.

    The clincher for Class B is the sharpest evidence in the whole sweep. build.yml and nightly.yml carry the CI worker-sizing numbers, and CiClusterWorkerSizingTests enforces them at 72/83. The README's copy of those same numbers read 57/68. One was guarded, one was not, and only the guarded one was right. That is the argument for pinning, made by the repo rather than by anyone's judgement.

    Some of the measured drift

    site claimed measured
    Darling:7 48 / 41 / 7 collectors 69 / 42 / 27
    :832 57 and 68 workers 72 and 83
    :717 V1 all 54 tables 69
    :520 Twelve read tools 12 named / 32 real
    :504 Twenty 21 — stale against its own sub-bullets
    root :217, :353 Lite 77 tools 87

    And a claim that was outright false rather than stale: :693 said "Every one of the twelve has an MCP tool." Not on dev — pg_plan_capture_readiness had no read, which is exactly what #3071 adds. Naming it as the exception would have gone stale the moment that merged, so the universal is gone instead.

    Three failures worth more than the fixes

    Two of the sweep's own greps were wrong first. A file-level !IsAzureSqlDb scan reported 14 against a true 6; a bullet-scoped regex over-captured prose cross-references, reporting 5 and 3 where the truth was 3 and 2. Both would have been published as findings — and both were the same defect this issue is about, one level up. The figures were re-taken from a net10.0 harness over the real PerformanceMonitor.Collectors and .Darling.Storage assemblies rather than from text matching.

    The class-A pass skipped the reported site. It hit eleven of twelve bullets and missed the PostgreSQL one — the very site this issue names. The script printed "applied 11" while the commit message said twelve. Caught by re-reading the rendered prose, not by any assertion.

    And the new pin would have shipped with the defect it prevents. Darling/**/!(*.md) excludes the one file the pin parses, so a README-only edit would never have run it. A guard that cannot fire on the thing it guards. Fixed by adding Darling/README.md to the filter at all three sites, with the same reasoning as the adjacent nightly.yml entry.

    Not verified

    The xUnit runner itself and the rest of Darling.Tests; the viewer counts came from XAML and the PostgreSQL tab registry rather than a running viewer; the --test-connection transcript is derived through the real gate rather than captured live. And "fixed aggregate tabs" is genuinely ambiguous — 5, 6 or 7 depending on gated and hidden tabs — so the prose now avoids counting it at all, which is the honest answer rather than picking one.

  2. added a commit that references this issue on Sep 6, 2026
    987c005
  3. erikdarlingdata commented on Sep 6, 2026

    @erikdarlingdata
    OwnerAuthor

    Claude posting for Erik Darling

    Fixed by #3073, merged to dev as 987c005c9bb. Closing by hand — a closing keyword in a PR body does not fire when the PR targets dev rather than the repository's default branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions