Skip to content

docs: split the README into topic pages and move the changelog out - #27

Merged
CaffeinatedCoder merged 1 commit into
mainfrom
docs/split-into-topic-pages
Aug 16, 2026
Merged

docs: split the README into topic pages and move the changelog out#27
CaffeinatedCoder merged 1 commit into
mainfrom
docs/split-into-topic-pages

Conversation

@CaffeinatedCoder

Copy link
Copy Markdown
Owner

The root README.md was 584 lines, 350 of them the PostgreSQL section alone — the landing page was mostly a provider manual for one of three packages. This splits it, following the arrangement in the CodoMetis.ValueRanges repository.

The split

File Lines Was
README.md 176 584
docs/postgresql-indexes.md 148
docs/postgresql-constraints.md 212
docs/sqlserver.md 47
CHANGELOG.md + 3 package changelogs 59 / 67 / 61 / 37 inline in 4 READMEs

PostgreSQL splits in two rather than into one page because that is the seam that already exists: indexes go through the differ plus the custom generator, while temporal and exclusion constraints are rendered as design-time SqlOperations.

No docs/architecture.md — that prose lives in CLAUDE.md and ClaudeMdConsistencyTests guards it. A second copy is drift with no guard.

The changelog move

It was the only part of the README that grew unboundedly, and it had two consumers pinned to its old home: release.yml's awk extraction and PackagingConventionTests' baseline lookup. Both now read CHANGELOG.md.

ChangelogConsistencyTests now asserts the ## x.y.z heading style rather than merely parsing it. release.yml matches that heading literally to build the release notes, so a section demoted to ### would still read as documented while the release job published a blank release. Verified locally: the workflow's actual awk extracts 6 lines of notes for 5.0.3 from the new file.

Two new guards

The split introduces a dependency on links, which is the one defect that renders perfectly.

DocumentationLinkTests — relative links resolve to real files, #anchors to real headings, and the packed READMEs under src/ carry no relative links at all. nuget.org renders PackageReadmeFile with no base URL, so a relative link is dead exactly where most consumers arrive, and nothing at pack time notices.

DocumentationApiTests — every method the docs name exists in the public surface (EF Core/Npgsql/BCL calls are an explicit allowlist), and no provider page names another provider's exclusive API. Package validation already fails the pack on a removed public member, so what this adds is the rename fixed in source and forgotten in prose, and the name simply typed wrong.

Changelogs are deliberately out of scope for the API test: an entry saying 5.0.0 shipped HasExclusionConstraint stays true after a later rename, and asserting over them would turn every rename into pressure to rewrite history.

Verification

DocumentationApiTests went in green, and the vacuity check is why it is worth anything. Emptying its allowlist — which must then report exactly the external calls — showed AddDbContext missing from the result, because \b[A-Z][A-Za-z0-9]*\( never matches a generic invocation. HasTemporalForeignKey<Subscription>( is how every generic API in these docs is written, so the entire generic surface was unchecked while the test reported green. The regex now takes an optional type-argument list.

Every guard was then broken deliberately and caught by the right test:

Break Failing test
Renamed docs/sqlserver.md relative links resolve
Reworded a root heading that docs/ links into anchors resolve — named all 4 links
Relative changelog link in a packed README packed READMEs are absolute-only
Demoted ## 5.0.3 to ### root changelog documents the shipped version
Left a ## 5.0.3 copy in the root README no README carries a changelog
Renumbered a package section out of order sections are newest-first
Deleted a package CHANGELOG.md every package has a changelog
HasExclusionConstraint typo'd documented API exists
HasTemporalForeignKey<Subscription> typo'd same — would have passed before the regex fix
HasExpressionIndex on the SQL Server page provider pages stay in scope
HasExclusionConstraint in the core README same, reported as "(a satellite)"

Deleting a package changelog initially crashed four unrelated tests with FileNotFoundException and buried the actionable message, so both classes now skip a missing changelog and let the dedicated test own it.

Unit suite: 202 passed. dotnet pack still puts a README in all three nupkgs (no NU5019), with the changelogs correctly not packed. Integration not run locally — needs Docker.

🤖 Generated with Claude Code

The root README was 584 lines, 350 of them the PostgreSQL section alone, so the
landing page was mostly a provider manual for one of three packages. Provider
reference moves to docs/, split along the seam that already exists: PostgreSQL
indexes go through the differ plus the custom generator, while temporal and
exclusion constraints are rendered as design-time SqlOperations.

The changelog moves to CHANGELOG.md at the root and one per package. It was the
only part of the README that grew unboundedly, and it had two consumers pinned to
its old home: release.yml's awk and PackagingConventionTests' baseline lookup.
Both now read CHANGELOG.md, and ChangelogConsistencyTests asserts the "## x.y.z"
heading style rather than merely parsing it — release.yml matches that heading
literally, so a section demoted to ### would still read as documented while the
release job published a blank release.

Two guards for what the split newly depends on. DocumentationLinkTests: relative
links resolve to real files, #anchors to real headings, and the packed READMEs
under src/ carry no relative links at all — nuget.org renders PackageReadmeFile
with no base URL, so a relative link is dead exactly where most consumers arrive,
with nothing at pack time to notice.

DocumentationApiTests: every method the docs name exists, and no provider page
names another provider's exclusive API. Package validation already fails the pack
on a removed public member, so what this adds is the rename fixed in source and
forgotten in prose. Changelogs are out of scope — an entry saying 5.0.0 shipped
HasExclusionConstraint stays true after a rename, and asserting over them would
turn every rename into pressure to rewrite history.

That last test went in green, and the vacuity check is why it is worth anything:
emptying its allowlist showed AddDbContext missing from the result, because
\b[A-Z][A-Za-z0-9]*\( never matches a generic invocation. HasTemporalForeignKey
<Subscription>( is how every generic API in these docs is written, so the whole
generic surface was unchecked while the test reported green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@CaffeinatedCoder
CaffeinatedCoder merged commit 05fa2c9 into main Aug 16, 2026
9 checks passed
@CaffeinatedCoder
CaffeinatedCoder deleted the docs/split-into-topic-pages branch August 16, 2026 22:43
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