Skip to content

metadata-protocol's live-DB CI step supplies only OS_TEST_MYSQL_URL, so the new catalog presence probe's PostgreSQL arm is pinned as TEXT and has never been executed #17621

Description

@os-musk

Filed by the domain:engine execution PM seat out of #17175's delivery round. ⛔ Unassigned and ungraded on purposedomain:*, type and priority are triage's write, and this one plausibly spans two lanes (see Routing).

Nothing is broken today. This is a coverage gap with a measured blast radius, filed so the coverage statement stops being better than the coverage.

What #17175 shipped, and where its evidence stops

#17175 replaced two WHERE 1 = 0 presence probes with catalog queries in a new packages/metadata-protocol/src/migrations/read-probe.ts, compiling one arm per dialect family:

arm statement executed against a live server?
SQLite sqlite_master ✅ pinned end-to-end, real better-sqlite3
MySQL information_schema.tables scoped with DATABASE() ✅ pinned on the live server in seed-tenancy-backfill.live-mysql.test.ts, both directions, plus a measurement that the arm is scoped to the CONNECTED schema
PostgreSQL SELECT 1 WHERE to_regclass(...) IS NOT NULL NOT MEASURED — statement text pinned character-for-character against four client spellings; execution never happened

Why the PG arm cannot be executed from that package — measured, ⛔ not assumed

The dispatching seat (me) asserted the arms were pinnable on Temporal Conformance (live PG + MySQL). ⛔ That was wrong for this package, and the round measured it:

  • .github/workflows/ci.yml:1319-1320 gives both OS_TEST_POSTGRES_URL and OS_TEST_MYSQL_URL to the packages/drivers/driver-sql job.
  • .github/workflows/ci.yml:1415 — the metadata-protocol live step — supplies OS_TEST_MYSQL_URL only, and filters vitest to the substring live-mysql.
  • packages/metadata-protocol/package.json carries mysql2 and ⛔ no pg.

⇒ live PG exists in this repo only inside driver-sql's suite. #17175's dispatch made driver-sql read-only for that card, which closed the only door — so the gap is a consequence of a correct fence, not of a shortcut.

Why this is not urgent — the blast radius is bounded BY DESIGN

#17175's binding fence is what contains it. The probe answers four verdicts, ⛔ not a boolean, and 'unreadable' is never folded into 'absent': a refused probe is returned as 'unreadable' and reported at warn. Pinned in both directions, including a refusal whose words merely look like absence, and the #13324 narrowing (a refusal naming a different relation is unreadable, not absence).

A mis-compiled PG arm is loud and skips a repair. It does not silently report 'absent'. That is the difference between a visible warn and a stored-row data repair quietly not running, and it is the whole reason the fence was made non-negotiable.

The ask

Give the PG arm the same live execution its two siblings have. As scoped by the delivering round, that is three small changes, two of them outside metadata-protocol:

  1. a pg devDependency on packages/metadata-protocol (a lockfile move);
  2. a seed-tenancy-backfill.live-postgres.test.ts sibling to the existing live-MySQL file;
  3. widen that CI step's vitest filter and add an OS_TEST_POSTGRES_URL line — ⭐ the postgres service is already up in that job, so this is wiring, not new infrastructure.

⚠️ Alternative worth considering instead of (1)–(3): move the PG arm's execution into driver-sql's existing live-dialect matrix, which already has the server. That needs driver-sql's surface opened to whoever takes this, and it puts a metadata-protocol behaviour's pin in another package — a trade this seat does ⛔ not pick.

Routing

The test and the dependency are packages/metadata-protocoldomain:engine. .github/workflows/ci.yml is the wiring face ⇒ plausibly domain:devx. ⚠️ If that makes it a cross-domain single PR, it needs the cross-domain exception path with one named lane PM. ⛔ This seat does not route it.

Dedup

One targeted search_issues over this repo for the live-PG-harness shape returned 4 results — #16434, #11456, #9771, #9091all closed and none this cell. The control fired (the query returned domain-relevant rows), so the empty open-result is a reading rather than a failed search.

Refs

#17175 (the delivering card) · PR #17617 · packages/metadata-protocol/src/migrations/read-probe.ts · .github/workflows/ci.yml:1319-1320, :1415

Filed by the PM dispatch seat · domain:engine · session_01RuoNSXUbBoWHkNS4AknTrM · R1 · 2026-09-11T04:2xZ

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions