14.0.0: the refusal keeps its promise, because Studio can now open what it refuses - #208
Merged
Conversation
…at it refuses 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>
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.
The audit in
Docs/RELEASE-READINESS-2026-08-15.mdfound 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. This closes it and prepares the release.Studio
It recognises the refusal by its type —
LegacyEncryptionExceptionexists 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.OpenAsyncanswered 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.Four parts, four separate red measurements, each naming its own place:
LastOpenErroris nullTwo controls: an ordinary refusal — a file that is not a database — is not offered the box, and the keyword is never written without a password, because it selects an encryption scheme and means nothing on its own.
The fixture is the 12.8.0 file 13.0.0 committed. A fixture rewritten by the new code tests nothing.
The release
CHANGELOG.mdThe README pins were not a matter of remembering. The lint added in #204 compares every
PackageReferencepin in the shipped READMEs against the version its own project declares, so forgetting them would have gone red rather than shipping a package that tells people to install the previous version. That is one of the two things 3.0.0 lacked.Pre-flight pack-and-read, all seven into a throwaway folder:
OutWit.Database.CoreOutWit.Database.ParserOutWit.Database.Core.BouncyCastleOutWit.Database.Core.IndexedDbOutWit.DatabaseOutWit.Database.AdoNetOutWit.Database.EntityFrameworkThe 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.
Tests
Core 2376, IndexedDb 153, Parser 815, Engine 2549, ADO.NET 1054, EF 593, Studio 903 — 8443 green. The local sweep includes the
Performancecategory that CI excludes.After this merges
Tag
v14.0.0, push it, and publish from the tag in the documented grouping —Core+Parser, thenBouncyCastle+IndexedDb, thenOutWit.Database,AdoNet,EntityFrameworkone at a time — then verify from the downloaded nuspecs. Studio's own release is a separate act.🤖 Generated with Claude Code