Skip to content

docs: align documentation with live sources and gate typography regressions - #222

Merged
SkyeAv merged 8 commits into
mainfrom
docs-overhaul
Oct 16, 2026
Merged

SkyeAv merged 8 commits into
mainfrom
docs-overhaul

Conversation

@SkyeAv

@SkyeAv SkyeAv commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Corrects the user-facing documentation against the Python/Rust sources, live CLI
behavior, and pipeline-emitted output; normalizes the remaining 323 non-ASCII
characters (317 in the changelog) to ASCII; and adds a test gate so the
typography and AI-tell fixes cannot regress. No source behavior changes; the
only test addition is the new gate.

Source-verified corrections

  • CLI and fullmap pages (docs/cli.md, docs/fullmap.md): corrected auditor-flagged claims against src/tablassert/cli.py, src/tablassert/fullmap.py, and live command output (progress-code glyph semantics, quick_map behavior, version/default facts).
  • API pages (docs/api/qc.md, utils.md, lib.md, fullmap.md): QC thresholds confirmed live (SIMILARITY_THRESHOLD 0.5, fuzz 70/80); log path ~/.tablassert/log/tablassert.log; merge scalar-conflict rule (lexicographic minimum, rust/src/ndjson.rs:302); column_context fixed False for probe batches; taxon filter keeps TAXON_ID == 0 rows alongside the requested taxon.
  • Configuration pages (docs/configuration/graph.md, table.md, advanced-example.md): source_record_urls/upstream_resource_ids are not edge columns (133-entry ALLOWED_EDGE_FIELDS excludes both); uuid_on_collision example fixed from "first-wins" to the lexicographic-minimum rule; rig.source_files written sorted+deduplicated; QC default rows, data_access_locations min-length, and the category grant list corrected after biolink-model 4.4.6 absorbed population_context_qualifier; rows/row_slice are NonNegativeInt; NodeEncoding.taxon documents its live 9606 default; extracted_from_row_number is consumed into row:<N> StudyResult ids and dropped, never emitted. The rig: page now states that artifact_base_url/artifact_base_path are Tablassert-only config keys and where Tablassert requiredness deliberately diverges from the upstream RIG schema and template.
  • Root pages (README.md, docs/index.md, installation.md, tutorial.md, CONTRIBUTING.md, llms.txt, docs/examples.md): sample node/edge JSON regenerated from real pipeline output via the test suite's fake-fullmap harness (node records carry in_taxon+provided_by, no taxon scalar; edge ids are uuid3; p = 1e-3 maps to very_strongly_significant per coerce.py banding; inlined study name is <config>.yaml SECTION <n>); uv tool install no longer presented as exposing the Python API; the openpyxl fallback claim removed (no fallback exists); missing-extra message example no longer misquotes errors.py; five (not six) CLI commands; build-fullmap shown with its default output path.
  • CHANGELOG.md: 217 em dashes, 51 arrows, and 49 other non-ASCII glyphs rewritten by grammar (comma/semicolon/colon/parentheses, "to" for renames, "then" for chains). Verified mechanically: 1035 lines, 76 release headings, versions, PR links, and digit sequences all preserved; zero characters above U+007F remain.

Style gate

  • Adds tests/test_docs_style.py: rejects non-ASCII outside an explicit allowlist (currently only the e-circumflex in Gwênlyn Glusman, the author name in CITATION.cff), prose arrows, space-flanked -- substitutes, and mid-prose double spaces across README, CHANGELOG, CONTRIBUTING, CODE_OF_CONDUCT, llms.txt, and docs/**/*.md. Inline code and fences are exempt. Landing it caught two real leftovers, fixed in the same commit.

Design

  • Docs were fixed to match source, never the reverse. Every correction was verified against code or emitted output before editing; several auditor claims were rejected after verification (QC thresholds, "four-stage" pipeline, redb records table existence) to avoid churn.
  • Worker/subagent output was treated as untrusted evidence and independently re-verified for every applied claim.

Testing

  • make check -> exit 0 (ruff clean, pyright 0 errors, 1243 passed, 1 skipped, cargo test ok, clippy -D warnings clean) after uv sync --group dev --extra cli --extra qc --extra log.
  • uv run pytest tests/test_docs_style.py tests/test_docs_source_of_truth.py tests/test_docs_examples.py tests/test_docs_cli_coverage.py -q -> 217 passed.
  • uv run mkdocs build --strict -> exit 0.
  • Residual corpus scan: 0 non-ASCII/arrows/double-spaces outside code spans.

Deferred: the stale redb version comment in rust/Cargo.toml (code comment, not user-facing docs), and the "KGX-compliant" phrasing precision (the KGX spec validates against the Biolink Model; a mass rewording was left out of this PR).

…rose

Treats the source tree as the absolute authority for both pages.

- progress output is now described in words instead of transcribing the U+2713
  and U+00B7 glyphs that src/tablassert/progress.py emits, so the page stays
  accurate while carrying no non-ASCII characters.
- docs/cli.md:263 used `snapshot\\|refresh\\|off`; the stray backslash escaped
  itself and the row split into extra cells. One backslash now renders the
  intended single cell (verified in the built site HTML).
- sha256 verification is documented as best-effort, matching
  _fetch_prebuilt_sha256 returning None and warning instead of blocking.
- quick-map prose fixed: unmatched terms print a `no matches` line and no table
  (cli.py:1252), and exit 2 covers bad flags plus a missing fullmap (cli.py:1216),
  not a fullmap that fails to open, which raises PyRuntimeError.
- Stages are sequential (cli.py:317-466), so "six parallel stages" became six
  stages in sequence; the per-section phase list gains `cache` and `transform`
  (lib.py:1675-1677).
- Worker caps now state the real formula min(CPUs, MemAvailable_GB / 2) with the
  90 percent non-Linux fallback, and shard fan-out is bounded by 16 shards rather
  than "all available CPU threads".
- Cache files are named by store suffix, not `.head.parquet`.
- Removed the unsourced ~50% and ~Nx throughput claims, the stale external
  DuckDB shard aside, duplicated aria2 commentary, and the "ideal aria2 use
  case" and "rather than a million" marketing phrasings.
- The 800085-of-2000085 figure is about 40 percent, so it no longer reads as
  "most of the edges", and its `--` separators are gone.
Every change here was verified against live code before it was written; three
auditor claims were checked and rejected (the redb records table, the
lookup_fullmap_terms entrypoint, and the producers clamp formula, which already
matched fullmap.rs:2545).

- utils.md named the SapBERT cache directory `.tablassert/sapbert/`; qc.py:27
  sets MODEL = BASE / "sapbert-babel", and qc.md already said so.
- namespace_uuid documented empty entries as dropped. They are not: rust/src/uuid.rs
  length-prefixes every part, so ["x","","y"], ["x","y"], and ["","x","y"] all
  hash differently (verified by running the extension).
- merge_records keeps the lexicographically smallest conflicting scalar
  (ndjson.rs:302), not the first record's value.
- The section store suffix list was missing `.linkouts` (cli.py:57,81).
- qc.md claimed two fuzzy scorers; qc.py:233-236 runs three, and the token-set
  scorer shares fuzzy_partial_threshold (qc.py:243). Thresholds are named by the
  configurable parameters rather than hardcoded 70/80.
- qc.md Stage 1 exact pass showed `original == preferred_name`; the code applies
  the alias map first (qc.py:207), so a configured alias can pass on exact match.
- qc.md said the audit "does not run until the very end of the build". It runs as
  per-column ops inside resolution (lib.py:1436,1502).
- Removed four unsourced Big-O "Performance:" lines and relabelled the invented
  "990 rows" cascade as unique pairs, which is what the cascade dedupes to.
- lib.md's "after the SQL query" is gone: there is no SQL in the read path, the
  FREQUENCY column is computed in Polars over fetched rows (fullmap.py:116-117).
- Taxon prose corrected in both api/lib.md and api/fullmap.md: the filter is
  category-blind and retains TAXON_ID 0 (fullmap.py:404-406), so it does not
  "return non-gene categories regardless of taxon".
- Provenance prose no longer claims a "matched synonym" column; the schema has
  SOURCE_NAME, SOURCE_VERSION, and the normalized term (fullmap.py:104-113).
- The resolve() example now applies level_one/level_two, because resolve_batch
  raises resolve-bad-specs when `<col>_two` is absent (fullmap.py:673-679).
- Junk-term filter names the real dead-term set (fullmap.rs:360-378).
- The uuid_on_collision merge example listed `source_record_urls` and
  `upstream_resource_ids` as list fields, but biolink.py:451-453 deliberately
  keeps both inside `sources` entries and ALLOWED_EDGE_FIELDS (133 entries)
  excludes them.
- Merge scalar arbitration is the lexicographic-minimum rule, not "first-wins";
  the supporting_case_ids exemption sentence is reworded to match (the Rust fast
  path keeps the lexicographically smallest canonical value, ndjson.rs:302).
- `rig.source_files` is written sorted and deduplicated (rig.py:670), not
  listed verbatim.
- `rig.target_info` now names the ModelingCategories enum values a
  future_considerations category may take.
- QC threshold rows state their live defaults (0.5 / 70 / 80 / empty) from
  models.py:1254-1257.
- `data_access_locations` requires at least one entry (min_length=1,
  models.py:1027-1029).
- The unsourced-percision framing "real 1.27M-edge graph" now names the dataset
  (MultiomicsKG 3.0.0), matching the CHANGELOG PR #122 measurements the numbers
  came from.
- "maximally brittle" and "PR-worthy by construction" benefit phrasing replaced
  with mechanism statements.
- The build-pipeline step list gains the seventh stage, Studying Graph, which
  runs under --qc (cli.py:466).
- advanced-example.md renders the resolved statement in prose (subject
  Lactobacillus rhamnosus, predicate correlated_with, object 13C-tamoxifen)
  instead of the `--[predicate]-->` edge notation, removing the page's last
  prose arrow.
The changelog carried 217 em dashes, 51 rightwards arrows, 17 multiplication
signs, 9 en dashes, 6 greater-than-or-equals, 5 minus signs, 5 ellipses, 3
left-right arrows, 2 almost-equals, 1 implies, and 1 superscript. All are now
ASCII punctuation chosen by grammar: comma for appositives, semicolon for
independent clauses, colon for definitions and lists, parentheses for
parentheticals; rename and before/after arrows read "to", pipeline chains read
"then"; math glyphs become >=, x, -, ~, ^2, ...; the one O(n^2) gains a caret.

Verified mechanically before landing: 1035 lines in and out; all 76 release
headings and their versions identical; all PR links, URLs, and digit sequences
preserved in order (single documented insertion from the ^2 rewrite); zero
characters above U+007F; zero prose arrows; zero space-flanked dash
substitutes outside inline code and the release-heading separator. The docs
guard suite (20 tests) and mkdocs --strict stay green. No release fact,
version, count, or ordering was changed.
Sample output (README, tutorial):
- Node records use `in_taxon` (a list) and always carry `provided_by`; the
  samples showed a nonexistent `taxon` scalar. Shapes confirmed by emitting
  real records through the build pipeline with the test-suite fake fullmap.
- Edge id is a uuid3 (version nibble 3); one tutorial sample had a v4 nibble
  and README reused the tutorial's id for a different study, which the
  deterministic id scheme makes impossible. Samples now use distinct v3 ids.
- p = 1e-3 maps to very_strongly_significant (coerce.py: band p <= 0.001);
  samples showed strongly_significant.
- Inlined study name is "<table-config>.yaml SECTION <n>" (lib.py study_name),
  not the source CSV name. Both sample sets fixed, and prose now marks the
  edge records as abridged (real records also carry knowledge_level,
  agent_type, sources, original_subject/original_object).

Installation:
- `uv tool install` is an isolated console-script install and does not expose
  the Python API; both pages now direct API users to pip/uv add into their
  project environment.
- Dropped the openpyxl fallback claim: no fallback engine exists, engine=
  calamine is the only path (openpyxl appears only in the test dependency
  group).
- The missing-extra message example no longer misquotes errors.py:226 (the
  code emits an em dash separator); prose describes the first sentence and
  the text block quotes only the install command.

Tutorial: `build-fullmap --output ./fullmap/data/fullmap.redb` simplified to
`tablassert build-fullmap` (that path is the cli.py:1556 default); trimmed the
lead paragraph's restating sentence.

CONTRIBUTING: `## Daily edit -> check loop` renamed (prose arrow); dropped the
machine-specific "20-30 seconds" pytest timing; added a docs-gate bullet
(docs guard tests + mkdocs --strict) to the PR checklist.

llms.txt: six -> five command implementations (cli.py registers five
commands); `package -> extra` hyphenated.

index.md: replaced the rhetorical bolded-question nav line with a plain
pointer sentence.
tests/test_docs_style.py rejects regressions of the docs-overhaul fixes across
README.md, CHANGELOG.md, CONTRIBUTING.md, CODE_OF_CONDUCT.md, llms.txt, and
docs/**/*.md: characters above U+007F outside an explicit allowlist (currently
only the e-circumflex in Gwênlyn Glusman, the author name in CITATION.cff),
prose arrows (->, =>, <-, and unicode arrow variants) outside code spans and
fences, space-flanked "--" em-dash substitutes in prose, and mid-prose double
spaces. Inline code and fenced blocks are exempt because they carry real CLI
flags, error text, and syntax.

Landing the gate surfaced two leftovers the manual scan missed:
CONTRIBUTING.md used " -- " as a sentence separator in the pre-commit prose,
and table.md's category_override cell used "--" twice inside parentheticals.
Both rewritten with commas/colons; the cell text is not pinned by any test
(the "unsatisfiable --" hit in test_biolink.py is that file's own docstring).

Ruff clean; the docs suites pass 217 tests; mkdocs --strict exits 0.
- rows/row_slice: NonNegativeInt in all three duplicated source tables
  (models.py:144-145); descriptions now say non-negative integer.
- NodeEncoding.taxon: documents the live 9606 default and the null-disables
  escape (models.py:302).
- category_override cell: population_context_qualifier is no longer a
  Tablassert grant; biolink-model 4.4.6 declared it natively and the tripwire
  removed the grant (biolink.py:595-602, CLASS_FIELD_OVERRIDES). The cell had
  contradicted the Annotations section, which already said this.
- extracted_from_row_number: it is tracked internally and consumed into the
  row:<N> StudyResult ids, then dropped along with sheet_name; it is never
  emitted as an edge field, so "every edge automatically carries it" was
  wrong (lib.py:520-538).
- rig section: artifact_base_url/artifact_base_path are Tablassert-only config
  keys, not RIG schema slots, and the "always schema-shaped" claim is replaced
  with the two real divergences (the artifact_* keys; requiredness differences
  where the upstream schema and template disagree, e.g. source_status, which
  Tablassert requires per the stricter template).
- [aria2]: on macOS the sdist build hook fails, so do not install the extra
  there; build-fullmap uses the Python downloader.

All claims verified against live models (uv run python model introspection)
and the upstream RIG schema YAML. Docs guards 217 passed; mkdocs --strict 0.
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e3e9840b-9de6-488e-b766-98457381e790
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@SkyeAv SkyeAv changed the title docs overhaul docs: align documentation with live sources and gate typography regressions Oct 15, 2026
@SkyeAv
SkyeAv merged commit 7f4e28f into main Oct 16, 2026
5 checks passed
SkyeAv added a commit that referenced this pull request Oct 16, 2026
Cut 22.0.0 and bump the package version in pyproject.toml, CITATION.cff,
and uv.lock.

Major: the no_map node mode added in 21.0.0 is removed because verbatim
nodes cannot derive a role and collapsed to biolink:NamedThing with
flattened biolink:Association edges; configs setting the key are told
why, then rejected (#221). The user-facing docs are corrected against
the live sources, the changelog is normalized to plain ASCII, and
tests/test_docs_style.py now gates typography regressions (#222).

Changelog:
- Versioned the 22.0.0 section from the two merged PRs (no Unreleased
  section existed), added PR links to both entries, and added the
  migration note for the no_map removal.

Docs: none needed here; the docs pages themselves were aligned in #222
and the new style gate covers the CHANGELOG edit in the test suite.

Testing:
- make check -> exit 0: ruff check "All checks passed!", ruff format
  "71 files already formatted", pyright "0 errors, 0 warnings,
  0 informations", pytest "1222 passed, 1 skipped in 23.81s", cargo
  test 127 + 11 (1 ignored) + 17 + 1 passed, clippy -D warnings clean
- uv run mkdocs build --strict -> exit 0
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