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:

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:

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.