Skip to content

docs: seven corrections, including one that misdirects contributors - #23

Merged
EricAndrechek merged 1 commit into
mainfrom
docs-correctness
Sep 11, 2026
Merged

EricAndrechek merged 1 commit into
mainfrom
docs-correctness

Conversation

@EricAndrechek

Copy link
Copy Markdown
Member

Found by reading every doc in the repository against the code and the CI config, rather than grepping it. Touches no workflow file, so it is independent of #22.

1. CONTRIBUTING.md actively misdirects — highest severity here

"Markdown formatting and structure … run in CI's prose job but do not block merges yet, for the same reason: this tree's markdown was written hard-wrapped and most of it hasn't been through a dprint fmt pass."

Both halves are false now. prose is a required status check on main — confirmed against the branch-protection API, which lists twelve — and ci.yml's own comment says the reformatting already happened and "Both checks pass, so both gate." A contributor reading this today believes a markdownlint failure cannot stop their PR.

It also never mentioned the public job, so the most surprising gate in the repository was undocumented for the people most likely to trip it. Added, with the fix: say what a thing is, not where it lives.

2. docs/reference/artifact.md — the spec contradicts the code it cites

Step 4 said four symbols are mandatory, while naming chtypes.NewRegistry in go/chtypes/multiversion.go as "the reference algorithm." That code requires seven:

// go/chtypes/multiversion.go:141-144
if (!out->version || !out->init || !out->rows || !out->compile
    || !out->freep || !out->validate || !out->schema_free) {

Python (_native.py:156), TypeScript (ffi.ts:135) and Rust (ffi.rs:175) require four and degrade the rest to unsupported. So this is not only a doc error — it is a real parity divergence nobody had catalogued: an artifact missing chs_free, chs_validate_type or chs_schema_free loads in three bindings and is flatly refused by the fourth.

The doc now describes both behaviours and points at #13. Picking a winner is that issue's job, and the finding is filed there. No artifact this repository builds is affected — every one exports all seven — so the blast radius is third-party and historical artifacts only.

The same file numbered two different items 6, because one 6. was buried inline at the end of item 5. Renumbered; the list is eleven steps.

3. docs/reference/bindings.md — a symbol that exists nowhere, and a miscount

  • It cited chs_schema_compile_with_settings as the symbol whose absence makes the probe answer false. That identifier exists nowhere — not in any binding, not in include/chtypes.h — and every binding's own doc-comment says the probe is always true post-consolidation.
  • It announced "Two independent detectors" and then numbered three.
  • It presented 't'/'f'/'e'/'d' as the universal verdict spelling. TypeScript renders 'true'/'false'/'error'/'decline'. The four states and the fail-closed rule genuinely are identical; the spelling is not, and two SDKs cannot share a log format across it. Now disclosed where verdicts are described, pointing at SDK parity: 12 divergences between the four bindings that need a decision, not a fix #13.

4–7. The rest

file was now
reference/python.md listed Schema, Filter, Block as the context managers Registry is one too (registry.py:1160); Library deliberately is not, with the reason
install.md advertised ffi-rs's prebuilt matrix (darwin x64, musl…) notes chtypes artifacts ship for three platforms only — an Intel Mac or musl user installs cleanly, then chtypes fetch has nothing for them
index.md Reference table never linked reference/artifact.md linked — it is what a reader debugging a fetch or verify problem wants
limitations.md gated filters on an internal rig "gating green" gated on a release saying so, which a public reader can actually check

Verification

All four parity suites pass — they read bindings.md, and the Python one asserts the manifest and that document agree on the object-model table, so an edit there is not free. lint-public, lint-prose, markdownlint and dprint check all clean.

🤖 Generated with Claude Code

https://claude.ai/code/session_018ckJDLjWhAAttQVrYnQEJD

Found by reading every doc in the repository against the code and the CI
config, rather than grepping it.

CONTRIBUTING.md said the markdown/prose checks "do not block merges yet,
for the same reason: this tree's markdown was written hard-wrapped and most
of it hasn't been through a dprint fmt pass." Both halves are false now.
`prose` is a REQUIRED status check on main (confirmed against the branch
protection API — there are twelve), and ci.yml's own comment says the
reformatting happened and "both checks pass, so both gate". A contributor
reading this today would believe a markdownlint failure cannot stop them.
It also never mentioned the `public` job at all, so the most surprising
gate in the repository — no pointers into the private repository, no
citations of paths that are not here — was undocumented for contributors.

docs/reference/artifact.md step 4 said four symbols are mandatory while
naming `chtypes.NewRegistry` in go/chtypes/multiversion.go as "the reference
algorithm". That code requires seven: Go also demands chs_free,
chs_validate_type and chs_schema_free, because its C shims call them without
NULL checks. Python, TypeScript and Rust require four and degrade. So the
spec and the implementation it cites disagree, AND this is a real parity
divergence nobody had catalogued — an artifact missing one of those three
loads in three bindings and is refused by the fourth. The doc now describes
both behaviours and points at #13; picking a winner is that issue's job, and
the new finding is filed there. No artifact this repository builds is
affected: every one exports all seven.

The same file's Loading list numbered two different items 6, because one
"6." was buried inline at the end of item 5. Renumbered, now eleven.

docs/reference/bindings.md cited `chs_schema_compile_with_settings` as the
symbol whose absence makes the probe answer false. That identifier exists
nowhere — not in any binding, not in include/chtypes.h — and every binding's
own doc-comment says the probe is ALWAYS true post-consolidation. It also
announced "Two independent detectors" and then numbered three.

bindings.md also presented 't'/'f'/'e'/'d' as though it were the universal
verdict spelling. TypeScript renders 'true'/'false'/'error'/'decline'. The
four states and the fail-closed rule really are identical; the spelling is
not, and two SDKs cannot share a log format across it. Disclosed where the
verdicts are described, pointing at #13 where the decision lives.

docs/reference/python.md listed Schema, Filter and Block as the context
managers. Registry is one too (registry.py:1160). Library deliberately is
not, and that now says so with the reason.

docs/install.md advertised ffi-rs's prebuilt matrix — darwin arm64/x64,
linux arm64/x64 gnu and musl — without noting that chtypes artifacts are
published for three platforms only. An Intel Mac or musl user installs
cleanly, then `chtypes fetch` has nothing to give them.

docs/index.md's Reference table never linked docs/reference/artifact.md,
which exists and is what a reader debugging a fetch or verify problem wants.

docs/limitations.md gated the filter surface on an internal rig gating
green — a condition no public reader can check. Now gated on a release
saying so, which they can.

All four parity suites still pass; they read bindings.md, and the python one
asserts the manifest and that document agree on the object-model table.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018ckJDLjWhAAttQVrYnQEJD
@EricAndrechek
EricAndrechek merged commit 0cf929a into main Sep 11, 2026
14 checks passed
@EricAndrechek
EricAndrechek deleted the docs-correctness branch September 11, 2026 18:48
EricAndrechek added a commit that referenced this pull request Sep 13, 2026
… does (#26)

Issue #13 A6 asks whether the missing scope-based release on Library is a
divergence to fix or a design to document. It is the latter, and
bindings.md §Teardown already carries the full reasoning: a scope-based
close on a Library is the mid-lifecycle teardown measured on 2026-08-31 to
segfault on the next open, so Python and TypeScript both withhold it from
Library alone, on purpose.

python.md gained the one-line pointer in #23. ts.md is the other language
with the same asymmetry and did not have it, so a reader of ts.md alone
still met the surprise with no explanation. Now both say it.

No code change: A6 needed confirming and documenting, not fixing.


Claude-Session: https://claude.ai/code/session_018ckJDLjWhAAttQVrYnQEJD

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant