Missing test helpers in the catalogue runs
Cleared on 11 October 2026. It opened at 69 posts and 134 names and the sweep now comes back empty. This file stays as the record of what the exercise cost and what it found, because the defect will come back: a post written after today can call what it does not show, and the gate’s blind spots below are the reason a clean sweep is not a guarantee.
Re-run it by sweeping scripts/check-reference-post.sh over each group and
taking its CALL GRAPH lines, worst first.
What the gate filters, and what each filter cost
Started at 134 names across 69 posts. Every filter below went in because it was producing false positives, and together they took the list to 30:
- Go builtins, and names in
//and/* */comments: a doc comment writingceil(log2 n)or1.04/sqrt(m)is prose. - Func-typed parameters and fields (
onSuspect,sendin heartbeat), named func types, and any name bound to a value (var cancel context.CancelFunc). - Type conversions (
fixedClock(...)), groupedtype (...)blocks, and interface method declarations: theVisitorinterface’s nineVisitmethods andquerier.ExecContextare declared, not defined. - Both letter cases. The pattern matched only lowercase initials, so an
undefined
TenantFromwas invisible while the seven lowercase names beside it were reported. Closing that found 64 more. - Fences with anything after the tag. A fence written
```gowith trailing whitespace was dropped entirely, so every definition inside it read as missing. - String and raw-string literals. A
Fatalfreading"sizeof(shard) = %d"reportedsizeof, and a backtick-quoted SQL block callingcoalesce(...)reportedcoalesce. Stripping raw strings alone took the list from 42 names to 30.
EXCEPT: names that should stay undefined
Two classes, both in the script with their reasons.
Quoting code from elsewhere, where printing the callee means reproducing
what the post is reading: pdqsortOrdered inside slices.Sort,
runtime_notifyListAdd and runtime_notifyListWait inside sync.Cond.Wait,
cheaprandn inside selectgo, and Parse, the parser the price post names
and declines to print.
A strawman the post discards: the abstract-factory post opens on three provider-named constructors it replaces two paragraphs later.
A cross-post oracle is not an exception. The A* post tests against
Dijkstra and the Dijkstra post against BellmanFord, and each has to be in
scope where it is called.
Two blind spots a regex cannot close
A package-qualified call is filtered as method-only, because
storage.New cannot be told from a method on a value. The abstract-factory
post calls six constructors that way, prints none, and the gate sees
nothing.
An undefined method on a post-defined type, for the same reason. The
leader-and-followers post called SetTerm, SetLog and Term with none
defined and only NewNode beside them was reported; the
persistent-data-structures post calls m.check() and prints only
checkNode.
A name passed as a value and never called is invisible for a third
reason: nothing in the pattern looks at pipe(f1, f2, f3). The pipeline
post passed three stage functions it never defined, and the gate reported
only the plain count(1000) beside them. Its agent replaced them with
inline closures, matching what the post’s two sibling tests already do,
rather than invent three named functions whose bodies the prose never
describes.
So a report is a starting point, not a census, and the agents build the
post’s Go in a scratch module rather than trust the list. That is also how
they found two real bugs: the price post panicked on its own first subtest
(the root Node left Mode unset, so fold dereferenced
compounders[""]), and the control bus stored nil into its policy pointer
whenever a reload body was malformed.
Outstanding
None. The last four were vec, (v Vector) check and (d dense) merge in
the version vector, which only a compiler could see, and sum in the
knapsack post, which is the assertion that the coin list MinCoins
returned actually adds to the amount asked for.
What the exercise found beyond the helpers
Building a post’s Go rather than reading it turned up defects no read-through catches:
- The price post panicked on its own first subtest.
Withoutre-folds every node with children including the root, and the root literal leftModeunset.Compoundisiota, sofoldtook the compounder branch and dereferencedcompounders[""]. - The control bus stored nil into its policy pointer whenever a reload body was malformed, leaving the engine pricing with no policy.
- State watch’s Go did not build at all, calling ten names it never showed, nine of them methods the gate cannot see.
- The lease claimed twice that the Go runtime reclaims a mutex from a dead holder. It does not, and the sentence reads perfectly well.
- The messaging gateway’s contract suite has a case that fails as
published: it asserts
ErrRejectedfor a window that closes before it opens, against two implementations that do not validate the window. Recorded inBACKLOG.md, not fixed.
And a pattern worth more than any single fix: where a post measures with code it does not print, the figures drift and nobody can check them. Raft’s walk was restated three times at 385,629, 279,174 and 228,434 before settling; the replicated log still rests on a 400-generation election simulation whose code is not on the page, with three of its five columns having moved under re-measurement. Two agents independently recommended deleting a timing rather than correcting it, on the grounds that quoting a range gives the reader a precision the measurement does not have.