Skip to content

[finding] the new live-PostgreSQL cascade-delete cell is red-capable but CI never provisions it — the Temporal Conformance job runs driver-sql, not @objectstack/runtime #18734

Description

@huangyiirene

Filed by the domain:engine execution seat (session_01CqmCgU5RGDoJYhHUMVp2af) out of the #18617 round (PR #18732), as the seat's ruling B on that round's open_questions[0]. ⛔ Filed bare: finding only; domain:* / type / priority are triage's.

Blocked-by: #18617

What exists after PR #18732, and what does not

PR #18732 gives packages/runtime/src/cascade-delete-multivalue-lookup-real-driver.integration.test.ts a driver axis: the embedded SQLite cell plus a live PostgreSQL cell, provisioned by OS_TEST_POSTGRES_URL. ⭐ The PostgreSQL cell is red-capable and was shown red — an ablation of SqlDriver.applyJsonMembership produced 6 failed | 9 passed, with all six failures in the live cell and zero in SQLite, reproducing operator does not exist: json ~~ text (42883) byte for byte.

⚠️ Nothing in CI hands that cell a URL. Measured by the filing seat on origin/main, ⛔ not carried over from the report:

reading result
@objectstack/runtime inside the Temporal Conformance (live PG + MySQL) job window of .github/workflows/ci.yml 0
⭐ firing control — driver-sql in the same window 7 ⇒ the zero is a reading, ⛔ not a dead grep

⇒ That job provisions PostgreSQL and MySQL and runs driver-sql, the non-SQL temporal backends and metadata-protocol. It does ⛔ not run @objectstack/runtime, so the new cell reports itself un-run on every job.

What the cell does today without a URL — ⛔ it is not silent

The unprovisioned cell is a named skip that states which variable would run it, and under OS_EXPECT_LIVE_DIALECT_MATRIX=1 a missing URL is a failure rather than a skip, so a runner that claims to have provisioned a server cannot quietly degrade to SQLite-only. Measured: the full @objectstack/runtime suite without a URL reports 3661 passed | 1 skipped, and that one skip is this cell naming itself.

⚠️ A named skip is a report, ⛔ not coverage. That is the gap this card carries.

Why this is its own card and ⛔ not part of PR #18732

The seat ruled B on the round's open question, and the reasoning belongs here too:

  • The dispatch order told the dev to stop at .github/workflows/**, and it stopped. ⇒ Moving that fence because obeying it cost something would teach every later dev that the fence is negotiable.
  • The leg is enforcement on a surface shared by every PR in the repo: it adds a step that can block anyone's merge. ⚠️ It is ⛔ not a new gate — it provisions an existing suite — but the blast radius is the whole merge path, and that deserves arguing in the open rather than riding in as the tail of a test PR.

And the distinction that makes landing #18732 safe rather than a punt: #18172 shipped because the PostgreSQL face could not go red at all — no cell existed. After #18732 a cell exists and has been shown red; what remains is provisioning. ⇒ A narrower defect with a different fix and a different owner — which is why it gets a carrier instead of a sentence in a PR body.

Shape (⛔ a proposal, not a prescription)

Two steps in the job that already provisions the postgres service, derived and written out by the #18732 dev:

      - name: Build runtime and its dependencies
        run: pnpm exec turbo run build --filter=@objectstack/runtime... --concurrency=4

      - name: Run the runtime cascade-delete matrix against live PostgreSQL
        env:
          OS_TEST_POSTGRES_URL: postgres://postgres:[email protected]:5432/postgres
          OS_EXPECT_LIVE_DIALECT_MATRIX: '1'
        run: |
          pnpm --filter @objectstack/runtime exec vitest run --project local \
            cascade-delete-multivalue-lookup-real-driver

⚠️ The positional is a SUBSTRING, ⛔ not a glob — the same reading the metadata-protocol step already records for itself, where the glob form matched zero files. ⇒ A taker that "improves" it into a glob will silently run nothing, which is the defect class this whole family is about.

⛔ Not measured

  • Whether the taker should extend the existing job or add a new one, and what that does to job wall-clock on every PR. ⇒ A real cost this card ⛔ does not price.
  • Whether OS_EXPECT_LIVE_DIALECT_MATRIX=1 belongs on the whole job or only this step.
  • Whether any of the 29 other better-sqlite3 literals under packages/runtime/src/ should join the same leg. ⚠️ The test(runtime): pin the multi-value cascade-delete path on PostgreSQL, not only SQLite #18732 round deliberately did ⛔ not convert them (none carries a shipped dialect-specific defect), and this card ⛔ does not reopen that.

Dedupe words

OS_TEST_POSTGRES_URL runtime · cascade-delete matrix CI leg · live dialect matrix unprovisioned · Temporal Conformance runtime absent · named skip is not coverage

Refs: #18617 · PR #18732 (the pin and its ablation) · #18172 (the p1 that shipped in two releases) · #18200 (a different mechanism — which FILES a local green covers, ⛔ not which dialect)


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions