Uh oh!
There was an error while loading. Please reload this page.
docs(data-modeling): publish MySQL's two documented degradations as deployer-facing caveats - #9052
Merged
Conversation
…eployer-facing caveats (#9029) Ruling item 2 of #8739 declared MySQL a supported deployment target, which converts two known degradations from implementation notes into promises a deployer needs before choosing MySQL. Both lived only in source comments. - drivers.mdx gains a 'MySQL dialect caveats' overview at the point of choice (the Supported Drivers row now carries a caveat pointer, matching the MongoDB precedent in the same table), plus two new sections: the runtime uniqueness indexes MySQL cannot build, and the unnamed conflicting column. - The MySQL section's 'One behaviour genuinely differs' framing and the 'the one dialect limit' heading were exhaustive counts that this change makes false; both are corrected. - environment-variables.mdx and packages.mdx gain a pointer each, at the other two published sites where MySQL is chosen. Docs prose only. No source file, test or log message is touched, and neither degradation is relitigated. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm
os-project-manager
marked this pull request as ready for review
August 16, 2026 07:38
os-project-manager
enabled auto-merge
August 16, 2026 07:38
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 16, 2026
Merged
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 freeto 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#9029
Ruling item 2 of #8739 (maintainer 2026-08-15, comment
5302926756, provenance 「接受你的所有建议。」) declared MySQL a supported deployment target. That converts two known degradations from implementation notes into promises a deployer needs before choosing MySQL. Both lived only in source comments. Docs prose only — no source file, test or log message is touched, and neither degradation is relitigated.Gate union re-derived and run at final HEAD
d92adf3a4.The placement decision, and how it is defended
The card left the page and format open ("No opinion on the page or format… is the docs owner's call"). The test it set is the one that matters: a deployer evaluating MySQL must meet both caveats before committing to it. A note only a reader who already chose MySQL will find has not moved anything out of the source comment.
So the substance lands in one place and the point of choice gets a pointer:
content/docs/data-modeling/drivers.mdxMySQL dialect caveatsoverview table plus two new sectionsmongodb | mongo (single-tenant only — see below). This is the affordance the page already uses to stop a reader committing before meeting a caveat, so MySQL gets it in the identical shape.content/docs/deployment/environment-variables.mdxOS_DATABASE_DRIVERrowOS_DATABASE_SQLITE_JOURNAL_MODE) already links into this same page, so the pattern is established on that exact table.content/docs/plugins/packages.mdx@objectstack/driver-sql:159, "Supports: PostgreSQL, MySQL, SQLite"). The same file carries exactly this affordance for the sibling driver 30 lines below (Not supported: row-level tenant isolation … see Drivers → Multi-tenancy).Substance in one place, pointers elsewhere. This is not the parity sweep the card fenced off — no page was audited for implying dialect parity; these are the sites where MySQL is chosen. One sweep-class finding was measured and filed separately rather than fixed here (below).
Two exhaustiveness claims this change makes false, corrected with it
The MySQL section asserted a count, and the count is now wrong. Both corrections are the same sentence I was editing, not scope growth:
upsert conflict targets: the one dialect limit→…: the target MySQL cannot honour. Its anchor has no inbound links anywhere incontent/,apps/,packages/orexamples/(grepped before renaming), so the rename breaks nothing.What the caveats say, re-derived from source rather than from the card
1 — Uniqueness indexes MySQL cannot build
The card pointed at
view-definition-active-index.ts. Reading it turned up two more callers of the same probe, carrying the same degradation for different tables, so the published caveat covers all three rather than the one the card named:sys_metadataoverlay-index.tsgetMetaItemhas no defined answer for which row winssys_view_definitionview-definition-active-index.tssys_settingsys-setting-identity-index.tsSettingsServicehas no defined answer for which of two colliding rows winsTwo are partial (
… WHERE state = '…', which MySQL has at no version) and all three use functional key parts (COALESCE(…)). The page also states the reassurance the sources are careful about and a caveat could easily lose: the probe-first order means MySQL is left holding exactly the index it already had — never an unconstrained table, never a failed boot — with the gap announced aterroron every boot plus a duplicate-listing query.2 — The conflicting column is not named
Written to describe the decision, not to reopen it.
unique-violation.tsexplicitly refuses to derive a column from an index name and gives its reasons; the page carries those reasons (index names are free-form; a plausible wrong field is worse than none) and both consumers the source names — the import runner's form field, and #5495's autonumber retry where a wrong name is a wrong decision, not a vaguer message.Two precisions taken from source that keep this honest rather than alarming:
409 UNIQUE_VIOLATIONverdict is not degraded on MySQL. Only the column name is unavailable.isUniqueViolationErrorcovers MySQL on all three channels (ER_DUP_ENTRY, errno1062,duplicate entry), andUNIQUE_VIOLATIONis a registered code (error-code-ledger.zod.ts:210).The card's asymmetry claim, verified rather than copied
All three capability sites the card cites are live on
origin/main, so the argument for publishing the caveats stands:OS_DATABASE_DRIVER=mysql—environment-variables.mdx:52,cli.mdx:134and:324MysqlConfigas authorable datasource config —drivers.mdx:101andreferences/data/driver-mysql.mdxtypes.mdx, incl. the per-type dialect table at:1064And the asymmetry is real: neither degradation appears anywhere in
content/docstoday (grepped for partial-index and conflicting-column prose across the whole tree).One correction to the routing implied by the card:
references/data/driver-mysql.mdxis auto-generated frompackages/spec/src/data/driver/mysql.zod.tsand carries a DO-NOT-EDIT banner, so it cannot be a caveat landing site.Verification
check:doc-anchorsis the gate that matters here — it validates cross-file anchors (/docs/x#fragment), which is exactly what the two new pointers are, and it computes slugs with the samegithub-sluggerthe site uses. Green, so all six links this change introduces resolve on both sides.Check Documentation Links(lychee) is not runnable locally without a from-source Rust build. Its unique coverage beyond the anchor gate is page-path links without fragments, and this change introduces none — every new link carries a fragment and was validated by the anchor gate. The target file was confirmed to exist directly.Not in this PR
content/docs/**sweep for other places implying dialect parity — the card fenced that off explicitly. One sweep-class finding surfaced anyway and is filed unassigned rather than fixed here (see the report on MySQL's documented degradations are still source comments, not published support-matrix caveats — ruling item 2 of #8739 has no card #9029).skip-changesetapplies.Generated by Claude Code