Repository navigation
feat(compat): both Percona distributions are full relatives, measured rather than assumed (#424) - #508
Merged
Conversation
cevheri
force-pushed
the
probe/percona-wire-compat
branch
from
August 26, 2026 20:50
351a493 to
cf5df05
Compare
… rather than assumed (#424) The two cheapest names left on Phase 0's list, and the reason to spend a probe on a drop-in build at all is that "drop-in" is a claim someone else makes. Both were probed on 2026-08-26 through the real providers, surface by surface, and then read again in Chrome on the built app. **Percona Server for MySQL 8.4.11-11, `full` via `mysql`.** All fifteen surfaces answer, the numbers are correct (2000 rows read as 2000, 114688 bytes as 114688, index 65536), indexes and a foreign key are read back, `EXPLAIN FORMAT=JSON` parses, and all three maintenance actions succeed - `Analyze`, `Optimize` (InnoDB's own *doing recreate + analyze instead; OK*) and `Check`. Zero failed requests in the browser. **Percona Distribution for PostgreSQL 18.6.1, `full` via `postgres`.** Same result on the PostgreSQL side: all fifteen answer, 2000 rows and 131072 bytes read exactly, foreign key and indexes read back, `Analyze` and `Vacuum` both work, zero failed requests. The pair differs in exactly one thing, and it is the trap Garnet's row records landing on only one of them: **Percona for PostgreSQL names itself in `version()`** ("PostgreSQL 18.6 - Percona Server for PostgreSQL 18.6.1"), so the product displays it, while **Percona Server for MySQL answers a bare `8.4.11-11`** and keeps its identity in `@@version_comment`, which the provider does not read - browser-verified, Monitoring reads *MySQL 8.4.11-11*. A test pins that asymmetry, because a copied caveat is how a pair of rows stops describing two different measurements. **D32, and it belongs to the baseline rather than to Percona.** While writing the MySQL caveats, `getHealth()` was seen reporting `slowQueries: [{ query: "Performance schema not available" }]` on a server whose `@@performance_schema` is 1 and whose slow-query panel returns rows. Measured identically on a stock MySQL 26.7.0 in the same pass, which is what settles the attribution: it is ours and pre-existing, a fabricated absence rather than a missing number, and it took a drop-in build to notice because a caveat had to be written about a reading that turned out to be the baseline's. Filed, not fixed. Counts: relatives 21 -> 23, published figure 35 -> 37, both re-derived from `connectableProductCount()`. No new driver and no new dependency. Local gates: format, lint, typecheck, knip, build, run-core.sh, run-components.sh.
cevheri
force-pushed
the
probe/percona-wire-compat
branch
from
August 26, 2026 21:18
cf5df05 to
70816f9
Compare
|
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.



Continues #424 Phase 0. Stacked on #506, which is itself stacked on #503 — review in that
order and each diff reduces to its own commit.
The two cheapest names left on Phase 0's list. The reason to spend a probe on a drop-in build
at all is that "drop-in" is a claim someone else makes, and this list's rule is that a name
counts after we connect to it.
fullviamysqlpercona/percona-server:8.4fullviapostgrespercona/percona-distribution-postgresql:18.6What was measured
Both called surface by surface through the real provider, then read again in real Chrome against
bun run build && bun run start.Percona Server for MySQL — all fifteen surfaces answer. Row counts and sizes are correct
(2000 rows read as 2000, 114688 bytes as 114688, index 65536), indexes and a foreign key are read
back,
EXPLAIN FORMAT=JSONparses, and all three maintenance actions succeed:Analyze,Optimize(InnoDB's own Table does not support optimize, doing recreate + analyze instead; OK)and
Check. Browser pass: treeprobe_customers 3/probe_orders 2.0k, zero failed APIrequests, Monitoring rendering version, uptime,
Connections 9/151,DB Size 192 KB,Cache Hit 97.5%,Tables 2 / 2 indexes.Percona Distribution for PostgreSQL — same result on the other side: all fifteen answer, 2000
rows and 131072 bytes read exactly, foreign key and indexes read back,
AnalyzeandVacuumbothwork, zero failed API requests in the browser.
The one asymmetry, and why it gets a test
The pair differs in exactly one thing, and it is the trap Garnet's row records — landing on only
one of them:
version()— PostgreSQL 18.6 - Percona Server forPostgreSQL 18.6.1 — so the product displays it and there is nothing to mistake for stock;
8.4.11-11and keeps its identity in@@version_comment(Percona Server (GPL), Release 11, Revision 57878ff8), which the providerdoes not read. Browser-verified: Monitoring reads MySQL 8.4.11-11.
A unit test pins that asymmetry in both directions — the MySQL row must carry the
@@version_commentcaveat and the PostgreSQL row must not — because a copied caveat is how apair of rows stops describing two different measurements.
D32: found here, belongs to the baseline
While writing the MySQL caveats,
getHealth()was seen returningslowQueries: [{ query: "Performance schema not available", … }]on a server whose@@performance_schemais1and whose slow-query panel returns rows.Measured identically on a stock MySQL 26.7.0 in the same pass, which is what settles the
attribution: it is ours and pre-existing, not Percona's and not caused by this work. It is a
fabricated absence rather than a missing number — the class the absence rule (#477) exists to
prevent — and the panel beside it disproves the statement. Filed as D32, not fixed: the honest
fix is either the rows
getSlowQueries()already produces or no line at all, and that is a changeto the MySQL health read with its own coverage.
It took a drop-in build to notice, because a caveat had to be written about a reading that turned
out to be the baseline's.
Counts
Relatives 21 → 23, published figure 35 → 37, both re-derived from
connectableProductCount()(14 external drivers + 23 relatives). No new driver, no new dependency. Both compose services are
pinned — for the MySQL one the tag is the only durable record of which build was measured, since
version()does not name it.Verification
format·lint·typecheck·knip·build·tests/run-core.sh(351 files) ·tests/run-components.sh(33 groups). Browser pass on the built app: hero reads Plus 23wire-compatible engines and names both rows; the MySQL hint names Percona Server for MySQL and the
PostgreSQL hint names Percona Distribution for PostgreSQL, both with no tier suffix, which is
how a
fullrelative renders.