Repository navigation
Conversation
…vives it 1.7.0 began asking before filing a newer Grail into a database that already had one, because install.gs recreated every runtime class and committed objects kept the old ones: stored dates, Decimals, tuples, sets, None and user-class instances stopped behaving as their types. That is no longer true. Grail installs with Rowan, keeps its classes, and install-grail.sh rebuilds every deployed module into its committed instance and classes (Grail #1791). Grail's upgrade test checks every stored object against the current class nightly, from 1.9.0's pin c8cbc92 (Grail #1867). The 1.10.0 engine upgrade already reinstalls Grail without a second question. So an update is installed like the MCP server's, from every trigger, and gemdb.reinstallPythonOnUpdate governs it again, default on, as it did before 1.7.0: it was kept in the manifest, deprecated, so a value set then means what it meant. Off, the update waits for Reinstall the Python Execution Engine, which no longer asks either: the command is the request. resumeRunning still files in only a first install, so windows activating together after an update do not race installs. The prompt, the status row's tooltip, the setting's description, the README and docs/automation-boundary.md now say what is measured, and the two cases that still need the user: a class whose bases the update changed while instances are stored (its import is refused with the gemdb.schema.rebase advice), and a class statement inside a function, which is new on every rebuild. Closes #186. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
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.
Closes #186.
Lands in #185 (
release-1.10.0), so it ships in 1.10.0.What changes for the user
gemdb.reinstallPythonOnUpdateis used again. It defaults to on. Off, the database keeps its current Python support until you run Reinstall the Python Execution Engine (the status view's Python row offers it).Why the prompt goes, not just its wording
git log -S confirmGrailInstallleads to 05f720f, which added the prompt in 1.7.0 for one reason. Filing a newer Grail into a database with Python support broke stored data.install.gsrecreated every runtime class, and committed objects kept the old ones. That was measured on 1.6.0 → 1.7.0: stored datetimes, Decimals, tuples, sets, None and user-class instances failedisinstanceand comparisons. The prompt was a data-loss warning, and nothing else in it called for a question.That reason is gone:
install-grail.shthen runsredeployModules.gs, which rebuilds every deployed module into its committed instance and classes (Grail #1791; Grail'sPersistent_Modules_and_Classes.mdD7 andReleases_and_Rowan.md).grail-upgrade.ymlnightly runs it fromrelease=c8cbc92, which is 1.9.0's pin and so the Grail every 1.9.0 database has. It passed on 2026-10-28 and 2026-10-29. #1867 measured that case at 243/0.A reworded question would have nothing left to ask. The remaining cases (below) are not helped by a question before the install. So the honest behaviour is the pre-1.7 one.
Why it is not under "Asked" in
automation-boundary.md: the install is persistent, but so is the MCP server's install, which was already automated. Both are GemDB's own code in GemDB's own database, and the next engine upgrade reinstalls Grail regardless. The setting gives anyone who wants control a way to opt out.The setting's migration story
gemdb.reinstallPythonOnUpdatewas never removed. 05f720f kept it in the manifest, deprecated, so that existing values were not reported as unknown. Un-deprecating it restores its pre-1.7 meaning:falsebefore 1.7.0 gets what they asked for then: no automatic update.The
.gemdb-grail-declinedrecord that 1.7.0–1.9.0 wrote is ignored. The next successful install removes it, as before. It is per-build anyway, so it could not match 1.10.0's build.What is still not carried over, and where it is said
The new wording claims only what is measured. These limits come from Grail's docs at the pinned commit:
gemdb.schema.rebase(...).namedtuple's. It makes a new class on every rebuild, so instances stored before keep the old class.Both are in the README paragraph, the CHANGELOG entry and
automation-boundary.md.A deliberate non-change
resumeRunningstill files in only a first install, not an update. After an extension update every window activates at once onto the running database, and nothing locks a Grail install across windows. So the update waits for the database's next use (a cell, Start, the Shell, an agent call) rather than racing installs from editors that only opened. Pre-1.7 GemDB did install from activation. I left that out on purpose rather than bringing the race back in a release PR.Files
src/lifecycle.ts:grailFileInAgreedandconfirmGrailInstallare replaced bygrailFileInDue, which reads the setting.reinstallGrailno longer asks.ASKS_ABOUT_PYTHON_UPDATESis renamedASKS_ABOUT_ENGINE_UPGRADES, its only remaining use. Comments are updated.src/config.ts:reinstallPythonOnUpdate()is restored.src/grail.ts,src/paths.ts: the declined-record writer and reader are removed. The cleanup of a leftover record is kept and commented.src/statusView.ts: the Python row's "update available" tooltip no longer says data stops working. It says when the update installs, or that the setting is holding it back.package.json: the setting's description is rewritten anddeprecationMessageis removed.README.md: the "How setup runs" paragraph is rewritten, and the setting is added to the settings table and its intro.docs/automation-boundary.md: the entry moves from Asked to Automated, keeping the 1.6.0 measurement as history. The engine-upgrade entry's reference is updated.CHANGELOG.md: new 1.10.0 entry, "Newer Python support installs without asking again".databaseStarted.test.ts(the update block is rewritten),statusRows.test.ts,manifest.test.ts,engineUpgradeStart.test.ts(stale mocks removed).Testing
I wrote the tests first and watched them fail (7 in
databaseStarted/statusRows, 1 inmanifest), then made the change. The new tests cover:filedGrail: update;Results:
npm test: 71 files, 1318 tests passed.lint,lint:toolchain,format:check,typecheckandtypecheck:strictare clean.npm run release:notes 1.10.0renders the new entry.~/GemDB, which I left alone. The evidence for "stored data survives" is Grail's upgrade test, cited above.🤖 Generated with Claude Code