Correction (2026-09-02). The original title and body of this issue claimed "15 of them have
no docstring either". That number is wrong. The real number is one. It came from a regex I
wrote, not from Julia, and the regex was bad. Measured with Base.Docs instead:
julia> ExperimentalAPI.audit(Pinax)
public names : 46
documented : 45
declared : 0
foreign : Symbol[]
unaccounted : [:Theme]
The rest of the issue stands, on a different axis. See "What is actually true" below.
What is actually true
Two different gaps were conflated in the original report. They are both real; only one of them is
the size I said.
Docstring presence — one name. Theme is the only public name in Pinax with no docstring.
Every other one of the 46 has prose reachable from ?.
Prose-file presence — still around 22 names. Separately from docstrings, these names appear
nowhere in CLAUDE.md, README.md or docs/:
@bibliography @code @debug_mode @md_str @newcommand @no_thumbnail @thumbnail
AgentBase AgentTheme GalleryBase GalleryTheme LaTeXBase LaTeXTheme
documenter_downloads documenter_gallery documenter_stage
dump_test_report load_test_dump
is_figure pinax_save rendered_assets set_bookmark!
That count came from grepping the three prose sources, which is a sound method for the question
it answers — but it is a different question from "does this have a docstring", and I reported
them as if the second implied the first.
Why the second gap still matters: CLAUDE.md has an explicit "Role / public API — the seam"
section, and these names are absent from it. So the seam as documented is smaller than the seam
as exported. is_figure and pinax_save are the backend contract — the two functions a third
party implements to add a plotting backend — and neither is mentioned outside its own docstring.
Where the correction came from
ExperimentalAPI.jl was built for exactly this check, and running it on Pinax is what exposed my
error. Its README names this distinction as a deliberate blind spot, which is why the two numbers
disagree and both are right about their own question:
Whether a name appears in your guide, README or docs site. Docstring presence is not
documentation-page presence, and those two gaps are usually different sets.
What would close this
Theme needs a docstring — that is a one-line fix.
For the prose gap, the durable form is a check rather than a docs pass:
using ExperimentalAPI
ExperimentalAPI.test_surface(Pinax)
That currently reports one name. It does not cover the prose-file gap, so closing that half
still means either writing the names into the CLAUDE.md seam section or deciding they do not
belong in it.
Worth pairing with declaring the testset.jl cluster experimental — render_test_report,
dump_test_report, load_test_dump, completeness_overview, @pinaxignore — which reads
Test stdlib internals, is absent from CLAUDE.md, and is not dogfooded in CI (#119, #120).
@experimental states that honestly instead of leaving it to a reader to infer.
What is actually true
Two different gaps were conflated in the original report. They are both real; only one of them is
the size I said.
Docstring presence — one name.
Themeis the only public name inPinaxwith no docstring.Every other one of the 46 has prose reachable from
?.Prose-file presence — still around 22 names. Separately from docstrings, these names appear
nowhere in
CLAUDE.md,README.mdordocs/:That count came from grepping the three prose sources, which is a sound method for the question
it answers — but it is a different question from "does this have a docstring", and I reported
them as if the second implied the first.
Why the second gap still matters:
CLAUDE.mdhas an explicit "Role / public API — the seam"section, and these names are absent from it. So the seam as documented is smaller than the seam
as exported.
is_figureandpinax_saveare the backend contract — the two functions a thirdparty implements to add a plotting backend — and neither is mentioned outside its own docstring.
Where the correction came from
ExperimentalAPI.jlwas built for exactly this check, and running it on Pinax is what exposed myerror. Its README names this distinction as a deliberate blind spot, which is why the two numbers
disagree and both are right about their own question:
What would close this
Themeneeds a docstring — that is a one-line fix.For the prose gap, the durable form is a check rather than a docs pass:
That currently reports one name. It does not cover the prose-file gap, so closing that half
still means either writing the names into the
CLAUDE.mdseam section or deciding they do notbelong in it.
Worth pairing with declaring the
testset.jlcluster experimental —render_test_report,dump_test_report,load_test_dump,completeness_overview,@pinaxignore— which readsTeststdlib internals, is absent fromCLAUDE.md, and is not dogfooded in CI (#119, #120).@experimentalstates that honestly instead of leaving it to a reader to infer.