Skip to content

A named skip cannot be ported: 66 suites and 1281 names have no expressible counterpart #1131

Description

@OffgridwithJD

Split out of #432 because #1040, which carried this as "phase 0b", is closed. It blocks 30% of the remaining port and nothing tracks it.

The number

remaining unported suites                              241
  carrying a NAMED gate (check_skip/pgc_skip/pgc_fail)  66   1281 names   30%
  clean                                                175   2917 names

Measured on a95c360, over the registered suites with no pytest twin, counting distinct names with _names_in (not _bash_names — see my correction in #432 about the two disagreeing enough to reorder the queue).

The top of the queue is in the blocked set: parquet_export_stats, 70 names, three gate calls.

The mechanism

check_skip, pgc_skip and pgc_fail record under the name they are given. expect.cannot_run(reason, detail) records under the reason CODE, validated against a closed list:

if reason not in UNRUNNABLE_REASONS:
    raise VacuityError(...)
self.unrunnable = (reason, detail)

So a port cannot emit the string at all, and compare_to_bash.py reports it MISSING. iceberg_fdw is the one pair that hit this and it is declared INCOMPLETE for exactly this reason, which is the precedent this issue generalises.

The entry there also refused the obvious workaround, and I agree with the refusal: naming a passing check could not read the server major, so the gate below cannot be trusted would read as an assertion that the major is unreadable.

There is a second thing going on, and it may be the real one

The grader is static; the gate is dynamic.

if [ "$PGC_MAJOR" -lt 18 ]; then
    check_skip "the differential analyze path" "SKIP  ... needs pg_restore_attribute_stats (PG18+)"
    pgc_summary
fi

On PG18 and PG19 that branch is not taken, so analyze_differential.sh never records the name. It records it on PG15/16/17 as a SKIP. On the majors where a port actually runs, the bash suite emits no such name — and the grader is asking the port to cover a branch that did not execute.

Three resolutions, not equivalent

  1. cannot_run carries a name as well as its reason code. Unblocks all 1281 at once and keeps the reason keyable for the stream. Largest change to pgc_vacuity.py.
  2. The grader learns about version-gated branches: a name reachable only under a PGC_MAJOR test is not required of a port running on a major where the branch is dead. Smallest change — but it asks the grader to reason about reachability in shell, which is the class this tree has been burned by four times (A sweep over shell source must strip comments AND decide about string literals: four guards got this wrong in one week #1123), so it needs a false-positive budget before it is trusted.
  3. Declare all 66 INCOMPLETE, each with a reason, as iceberg_fdw is. Costs nothing to build and is honest. It also means "one-for-one" stops describing a third of the corpus, and the INCOMPLETE dict becomes the place ports go to stop being graded.

My own preference is 1, weakly, because it is the only one that leaves the grader strict and the ports complete. But this is @jdatcmd's tool and the layer's own escape-hatch design, so I am filing the measurement rather than the patch.

Why it matters now

jd wants the pytest suite released before beta1. Whatever "released" turns out to mean, 30% of the remaining names sitting behind a design question with no open issue is the wrong state to discover late. Filed so it can be answered deliberately.

🤖 Generated with Claude Code

https://claude.ai/code/session_012RSw4qMHS7ByE7PY8Ns4cs

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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions