Repository navigation
docs(cli): say what a read-only boot's first connection writes to a SQLite file - #21779
Merged
objectstack-fleet[bot] merged 1 commit intoOct 4, 2026
Merged
Conversation
…QLite file The CLI reference said `os migrate duplicates` "writes nothing at all", and the same wording stood for every read-only boot: the data-migration dry runs, `os migrate plan`, `os secret orphans` / `rewrap`, and the shared read-only-boot paragraph. Measured through the CLI binary on a rollback-journal SQLite file no ObjectStack process had opened, each of those no-write modes moves header offsets 18, 19, 27 and 95 on its first run (the journal goes to WAL, as every ObjectStack connection does) and nothing on a second run; on a file ObjectStack already switched to WAL, both runs move nothing. The shared read-only-boot paragraph under Data migrations now states that once: the first connection converts the journal (a header change, no row or table), and after that a read-only run leaves the file byte-identical. Each per-command "writes nothing" now says what is true on its own (no row, no schema) and the prose sites point to that paragraph. seed-tenancy-repair.mdx carried the same claim about `os migrate duplicates` and gets the same qualification. Documentation only: no code or behaviour changes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016GiHYRmLSNWTfbX9gVQkpz
objectstack-fleet
Bot
deleted the
claude/issue-21745-writes-nothing-wal
branch
October 4, 2026 22:56
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.
Fixes #21745
Clause-②: no. Documentation is made true about existing behaviour; nothing is published.
Docs only: two files under
content/docs/, which no package ships. No code change, no behaviour change, no changeset.What changed
Triage graded #21745 option B: make the reference true, and leave the one-rule-for-every-connect ruling closed.
content/docs/deployment/cli.mdxnow says it once, in the read-only-boot paragraph under Data migrations:Each other "writes nothing" sentence about a command that opens the database now says only what is true on its own ("writes no row", "no row and no schema"). The prose sites (secret orphans, plan/apply, duplicates) link to that paragraph.
content/docs/deployment/seed-tenancy-repair.mdxmade the same claim aboutos migrate duplicates, and it gets the same qualification. The heading "Nothing is written before you confirm" is now "Nothing is applied before you confirm". No page undercontent/docslinks to the old anchor.Measured
Base:
origin/maind7fff21736. Every run used the built CLI binarypackages/cli/bin/run.js, launched as a child process.The fixtures.
os serveleft behind for a one-object app with an inline seed: 35 tables, WAL, auto_vacuum INCREMENTAL. Called "configured" below.VACUUM INTO, thenPRAGMA journal_mode = DELETE), so no ObjectStack process ever opened them:fsonly, never through a SQLite connection.A1.
os migrate duplicates --database-url file:Xon the NONE copy:71cdd04b096d02bf2c53ba0302bf2c53ba03Run 1 changed 4 bytes in the file, all in the header (offsets 18, 19, 27 and 95). Run 2 changed none. No
-wal,-shmor-journalfile was left after either run.A2. The no-write mode of every
bootSchemaStackcaller ran twice, each time on a fresh copy of each fixture. The callers are the family thatschema-migrate.one-shot-family.integration.test.tsreads off the source.migrateduplicates,plan,multi-value-columns,unmapped-columns,files-to-references,value-shapes,summary-nulls,meta --stored,recorded-by,resume,audit-metadata-bodiesandaccount-issuer;secret orphans;secret rewrap;storage orphans;meta resync.duplicates,plan)Every run exited 0 and printed parseable JSON.
Other modes.
os migrate applyanswerednat a real[y/N]prompt (a pty viascript), against a release one field and one object ahead: "Aborted — no changes made.", and the legacy file converted all the same (offsets 18, 19, 27 and 95). The configured file did not change.secret rewrap --applyandsummary-nulls --applychanged 0 bytes on their second run (legacy and configured alike).value-shapes --applyrewrites only its flag row,sys_migrationadr-0104-value-shapes. A row diff of both runs shows nothing else.The sites, one row each (line numbers are
d7fff21736's)cli.mdxskip-seed-datagloss (old :308)bootSchemaStackboot (skipSeedData: trueon every one)secret orphansreportsecret rewrapdry runsecret rewrap --applyre-run--applyrunplanplan/applyboot, answerednnrunplanmulti-value-columnsdry rununmapped-columnsduplicates(table row)files-to-references/value-shapesdry runs--apply's only write is the flag row"value-shapes --apply--applywrites is the flag itself"summary-nulls --applyre-runmigrateStored()duplicatesduplicatesos validate, :1595/:1616/:1711/:1662/:1729os generate, :1806/:1820os lint --fixgit grepof each command forbootSchemaStack,SqlDriverandbetter-sqlite3: 0 importsseed-tenancy-repair.mdx:311duplicatesSELECTs only"; WAL sentence plus linkA4, other pages. I ran
git grepovercontent/docs(excludingreleases/andreferences/) for "writes nothing", "read-only boot", "byte-identical", "changes nothing", and for every family command name. Hits with no edit:seed-tenancy-repair.mdx:123is about the log, and:251is about a later serving boot's repair rows.ui/translations.mdx:335:os i18n extract --check.commands/i18n/*.tshas 0 hits for SQLite or boot imports.automation/flows.mdx:1445: "writes nothing for it" refers to the decision nodes' rows.protocol/kernel/http-protocol.mdx:1241,ui/actions.mdx:261andconcepts/metadata-lifecycle.mdx:112are unrelated surfaces.Acceptance notes
OS_DATABASE_SQLITE_JOURNAL_MODE=deletemakes the first run on a rollback-journal file change 0 bytes (measured on the NONE and INCREMENTAL copies). The reference does not offer it for read-only runs, because on a file already in WAL the same setting converts the file back todelete. That is a write, to a served deployment's file.Verification (head
fcc13878fa)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 41 families atfcc13878fa. All 41 ran: 41 exited 0.check:skill-examplesrun exited 3 (PREREQUISITE NOT MET:client-reactwas not built). It exited 0 afterpnpm --filter @objectstack/client build && pnpm --filter @objectstack/client-react build.--ranreconciliation: "41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED".check:doc-anchors: "428 internal #fragment link(s) across 414 source file(s) all resolve". Two one-time ablations throughscripts/ablation-replace.mjs:/docs/deployment/cli#data-migrationsmutated: red, namingseed-tenancy-repair.mdx:316;#data-migrationslink mutated: red, namingcli.mdx:549.24ba2ab3876e,385558ab3097) andgit diff HEADempty.pnpm lint: eslint's population is**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}(eslint.config.mjs:971).eslint --format jsonon the 2 changed files reports 2 files, each "File ignored because no matching configuration was supplied". So no file in the lint population changed, and an.mdxedit cannot move a linted file's verdict.Check Documentation Links). Reason: CI runs them over the whole site, and lychee is not installed in this container.Generated by Claude Code