docs(about): the test a function has to pass to be part of this package's surface - #246
Merged
Merged
Conversation
Documentation build overview
27 files changed ·
|
This was referenced Aug 29, 2026
FBumann
force-pushed
the
claude/lookup-coverage
branch
from
August 30, 2026 07:13
2004634 to
9c8762c
Compare
FBumann
force-pushed
the
claude/what-counts-as-a-verb
branch
from
August 30, 2026 07:16
81ae378 to
27407cd
Compare
FBumann
force-pushed
the
claude/lookup-coverage
branch
from
August 30, 2026 18:19
9c8762c to
2b75498
Compare
FBumann
force-pushed
the
claude/what-counts-as-a-verb
branch
from
August 30, 2026 18:19
27407cd to
ab21495
Compare
FBumann
force-pushed
the
claude/lookup-coverage
branch
from
August 31, 2026 18:29
2b75498 to
010f9ea
Compare
…ge's surface The language has a test for what belongs in it and the ceiling has one for what may enter it; the API had neither, which is how a small surface grows a verb per feature. A verb decides nothing the language has not stated and needs nothing but the file, and the three properties it keeps are pure, total at load, and closed under composition. Reframed to stand on main: the merge.py bugfix and its tests that were bundled here now live on the composition PR (#244), where the behaviour and its test belong, and the page states composition-closure as the property a verb earns rather than a past defect in shipped code. Co-Authored-By: Claude <noreply@anthropic.com>
FBumann
force-pushed
the
claude/what-counts-as-a-verb
branch
from
August 31, 2026 20:56
ab21495 to
a32b6fc
Compare
FBumann
marked this pull request as ready for review
September 2, 2026 12:40
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
The following content was generated by AI.
What this changes
A third page in
about/, beside the two that already decide things.what-counts-as-language.mdsays which rules belong here;ceiling.mdsays which constructs may enter; neither says which functions may. That gap is how a small surface grows a verb per feature.Plus one behaviour fix and two property tests, because the page argues from a property the code had quietly lost.
The argument, in three moves
Capability is measured on the far side. The temptation is to measure an API by what a caller can call. Wrong end: this package builds nothing and solves nothing, so what it is worth is what a second consumer can build. A wide surface one program uses is narrower, in the sense that matters, than a small one a dozen programs read.
Which is why the largest capability this API can gain is not a verb. It is
Programbecoming a value another language can read — one serialisation, and every non-Python consumer stops needing a second implementation of the language to exist. Nothing else multiplies like that, and it adds nothing a caller must learn.Growth happens in the schema. The normal way this package gets more capable is a declaration:
cases:)piecewise:)sos:)coverage:)merge)A capability that arrives as a declaration is inspectable, printable, diffable and serialisable, because those are properties of the file. The same capability as a callback is none of them. A feature that can be a declaration must be one.
Three properties every verb keeps — pure, total at load, and closed under composition.
The property the code had lost
The third one is easy to lose and expensive to notice, and writing the page found it had already gone.
mergewrapped a lone objective in parentheses. Nothing was wrong with the answer — and merging one fragment gave back something that was not that fragment, while every nesting added another pair. An API can be correct and unpredictable at the same time, which is most of why the page is worth having.Fixed: a single objective is returned as written. Both properties are now pinned rather than asserted:
test_merging_one_fragment_gives_back_that_fragmenttest_a_composition_does_not_depend_on_how_it_was_grouped— merging is associative, so a library may ship a prelude already merged and a caller may merge it with their own fragments and reach what merging all of them at once reaches. Without it a composed library would have to document an order.to_specandto_programwere already idempotent; the page says so and the suite already held it.The sharp edge
The test cuts both ways, and the second cut is what keeps the page from being a fence around a museum:
mergepasses only because the rules it implements are written infile.mdand not in its docstring.What lpspec removes or changes
Nothing, and that is the point being made. No verb changes signature,
merge's output differs only in a redundant paren, and nothing here binds data.What it offers lpspec is a shared test rather than a shared rule.
lpspec/AGENTS.mdhas no equivalent page, and its surface is the one under real pressure — the operational verbs (IIS, elastic relaxation, run diffing) are all arriving at once. The second clause inverts cleanly for a consumer: a verb there is admissible iff every decision it makes is one the language or the sink has already stated. That is what keepsrelax=from becoming an engine flag on a model nobody can see, and it is why elastic relaxation belongs above as aSpec → Specfunction.Verified
Toolchain reconstructed at the versions
pixi.tomlpins:ruff format --check/ruff check(0.16.1, pinned) clean;pyrefly(1.2.0, pinned) 0 errors;reusecompliant;typosclean;prettier --checkover**/*.{md,yml,yaml}clean;pytest -q -n auto856 passed, 1 skipped (854 on the base — 2 new);python -m tools.render_texrenders 27 models;mkdocs build --strictbuilds with the new page and its nav entry.Not run:
zizmor,taplo(neither's files changed), and thetectonichalf ofcompile-tex.Deliberately not done
No new verbs. A page arguing for a small surface that shipped three would be arguing against itself. The two it names as worth having — a serialised
Program, and qualified names — are issues, not this diff.Not merged into
what-counts-as-language.md. They answer different questions about different things and that page already warns how easily it is confused with the ceiling; a third distinction inside it would be worse than a third page beside it.The falsification clause is not decoration. A capability somebody genuinely needs, which this test refuses, and which cannot be reshaped into a declaration, is a row against the page rather than an exception to it — the same standing the ceiling's refusal ledger has.
Stack: fifth, on #245 → #244 → #243 → #242 → #168.
Generated by Claude Code