Skip to content

Four places answered version 1.0.0, five READMEs installed 12.8.0, and a probe pinned the weather - #204

Merged
dmitrat merged 1 commit into
mainfrom
near-zero-versions-readme-probe
Aug 15, 2026
Merged

Four places answered version 1.0.0, five READMEs installed 12.8.0, and a probe pinned the weather#204
dmitrat merged 1 commit into
mainfrom
near-zero-versions-readme-probe

Conversation

@dmitrat

@dmitrat dmitrat commented Aug 15, 2026

Copy link
Copy Markdown
Owner

Three near-zero items from Docs/FIX-PLAN-FROM-SITE-FINDINGS-2026-08-15.md, each verified by execution before it was touched.

The version, in four places

answered read by
SELECT VERSION() 1.0.0 anyone checking what they are running
WitDbConnection.ServerVersion 1.0.0 every ADO.NET consumer
DataSourceProductVersion 1.0.0 tooling and ORMs, through GetSchema
DataSourceProductVersionNormalized 01.00.0000 the same, compared as a string

Every package is on 13.1.1. The finding named three; the fourth came out of looking for the rest. Four separate literals, four independent ways to go stale, and nothing that could notice.

WitDatabaseVersion reads the assembly's informational version — which is what the csproj's <Version> becomes — cut at the + the SDK appends the commit sha after, and normalises it to the padded shape DataSourceProductVersionNormalized exists to be compared in.

The guards read the assembly independently of the property under test. A case carrying "13.1.1" in its own text would be the same defect one layer out: it would pass today and need editing at every release, which is exactly how four literals survived thirteen major versions. Each carries a control that the assembly is not itself reporting 1.0.0, or the comparison would pass for the wrong reason.

All four sites were measured red separately — each names its own place:

Failed SelectVersionAnswersTheSameTest              Expected: "13.1.1"  But was: "1.0.0"
Failed ServerVersionIsTheEnginesVersionTest         Expected: "13.1.1"  But was: "1.0.0"
Failed TheSchemaRowsToolingReadsCarryTheSameVersion  Expected: "13.1.1"  But was: "1.0.0"
                                                     Expected: "13.01.0001"  But was: "01.00.0000"
Failed EvaluateVersionTest                          Expected: "13.1.1"  But was: "1.0.0"

The READMEs, and the rule found more than the finding named

A README ships inside the NuGet package, so it reaches people who never open the repository, and the first thing they copy out of it is the PackageReference. The finding named one file with three pins. The rule over every README under Sources/ found eight, across five packages, all on 12.8.0.

The Core README also still sold the claim the 11 August measurement retired — "LSM-Tree (write-optimized)", in three places. It carries the numbers now: with MVCC on, which is the default, the LSM store pays about 50x and the B+Tree 1.5–2x; the comparison the old claim described is the one with MVCC=false.

EveryInstallSnippetNamesTheVersionThatShipsTest compares each pin against the version its own project declares, counts the eight it examined so that "nothing left to find" cannot read like "the folder moved", and goes red with a single pin put back:

OutWit.Database.Parser/README.md installs OutWit.Database.Parser 12.8.0; the package is 13.1.1

The probe that reddened CI for saying too much

SecondaryIndexConcurrencyProbeTests.ProbeConcurrentAddOverABareIndexStoreTest asserted that the second writer's key was among the missing ones — one shape of the damage — while its own remarks say the shape varies.

It failed on 2026-08-15 on a branch touching no engine code and passed on a re-run of the same commit. On a loaded runner the second writer missed the two-second window, landed after the release, and its own entry survived — while 207 of the first writer's were lost. The damage was real and larger than usual; the case failed for having said in advance whose entry would go.

It now asserts what it can measure on a machine whose scheduling it does not control — that two writers in one leaf split damage the index — and reports the shape instead of pinning it.

Core 2371, Engine 2543, ADO.NET 1047.

🤖 Generated with Claude Code

…d a probe pinned the weather

Three near-zero items from Docs/FIX-PLAN-FROM-SITE-FINDINGS-2026-08-15, each verified by
execution before it was touched.

VERSION. SELECT VERSION(), WitDbConnection.ServerVersion and both version rows of
GetSchema("DataSourceInformation") each carried the literal "1.0.0" while every package
was on 13.1.1. The last two are what tooling and ORMs read to decide what a database can
do, and ServerVersion is what every ADO.NET consumer sees; the finding named three and the
fourth was found by looking for the rest. Each was its own literal, so each went stale on
its own and nothing could notice. WitDatabaseVersion reads the assembly's informational
version, cut at the sha the SDK appends, and normalises it to the padded shape ADO.NET
compares DataSourceProductVersionNormalized in.

The guards read the assembly independently of the property under test, because a case
carrying "13.1.1" in its own text would be the same defect one layer out - stale at the
next release, which is how four literals survived thirteen major versions. Each also
carries a control that the assembly is not itself reporting 1.0.0, or the comparison would
pass for the wrong reason. All four sites measured red separately: each names its own
place.

READMES. A README ships inside the package, so it reaches people who never open the
repository, and the first thing they copy is the PackageReference. The finding named one
file with three pins; the rule over every README under Sources found EIGHT across FIVE
packages, all on 12.8.0. The Core README also still sold the claim the 11 August
measurement retired - "LSM-Tree (write-optimized)" in three places - so it now carries the
numbers instead: with MVCC on, which is the default, the LSM store pays about 50x and the
B+Tree 1.5-2x, and the comparison the old claim described is the one with MVCC off.
EveryInstallSnippetNamesTheVersionThatShipsTest compares each pin against the version its
project declares, counts the eight it examined, and goes red with one pin put back.

THE PROBE. SecondaryIndexConcurrencyProbeTests asserted that the SECOND writer's key was
among the missing ones - one shape of the damage - while its own remarks say the shape
varies. It reddened CI on 2026-08-15 on a branch touching no engine code and passed on a
re-run of the same commit: on a loaded runner the second writer missed the two-second
window, landed after the release, and its entry survived while 207 of the FIRST writer's
were lost. The damage was real and larger than usual, and the case failed for having said
in advance whose entry would go. It now asserts what it can measure - that two writers in
one leaf split damage the index - and reports the shape.

Core 2371, Engine 2543, ADO.NET 1047.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dmitrat
dmitrat merged commit d96fbe5 into main Aug 15, 2026
1 check passed
@dmitrat
dmitrat deleted the near-zero-versions-readme-probe branch August 15, 2026 12:27
dmitrat added a commit that referenced this pull request Aug 15, 2026
…at it refuses (#208)

The audit of 2026-08-15 found the code ready and the release not, for one reason: #206's
message tells a user to convert their database by changing its password, and Studio - the
tool that does that - could not open such a database at all. The instruction was
unfollowable in the shipping tool. This closes it and prepares the release.

STUDIO. It recognises the refusal by its TYPE rather than by its wording -
LegacyEncryptionException exists for that, so nothing has to match a sentence that might be
reworded - explains what happened in words that name the version and the remedy, and offers
a checkbox that opens the database in the old format. Ticking it and pressing Connect gets
the data; a notification then says the conversion is one password change away.

Beside it, a smaller thing with a wider reach: a failed open now carries its reason back.
ConnectionManager.OpenAsync answered null and nothing else, so a database refused for one
nameable reason reached the dialog as the same sentence as a file that is not a database at
all. LastOpenError is what the dialog reads to tell them apart, and the control case asserts
that an ordinary refusal is still not offered the box.

Four parts, four separate red measurements, each naming its own place: the reason channel,
the recognition, the connection-string keyword, and the checkbox in the markup. The fixture
is the 12.8.0 file 13.0.0 committed - a fixture rewritten by the new code tests nothing.

THE RELEASE. Seven packages to 14.0.0, and the README install snippets with them; the lint
added in #204 compares those pins against each project's own version, so forgetting them
would have gone red rather than shipping a package that tells people to install the previous
one. Studio to 3.0.0-rc.2. Both CHANGELOGs carry their section, and the engine's is written
for somebody whose application stopped opening its database: what is wrong with such a file,
that it cannot be repaired by reading it, both ways forward, and the code for each.

Pre-flight pack-and-read, all seven into a throwaway folder: every package 14.0.0 and every
internal dependency 14.0.0. That check is what 3.0.0 did not have.

The version argument is #206 alone. Nothing else here can make a working application fail:
the version strings change what an answer SAYS, and everything else adds.

Core 2376, IndexedDb 153, Parser 815, Engine 2549, ADO.NET 1054, EF 593, Studio 903 - 8443
green, and the local sweep includes the Performance category that CI excludes.

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