Skip to content

typing_extensions 4.16.0 Sentinel repr change breaks the lowest-direct CI leg #554

Description

What happened

The Check (lowest-direct, py3.10) job failed on PR #551 (run) on a doctest in overture.schema.system.feature.Feature:

Expected: Fence(id=<MISSING>, bbox=<MISSING>, ...)
Got:      Fence(id=MISSING, bbox=MISSING, ...)

The PR's diff (12 file deletions, no dependency surface) is unrelated; the failure reproduces without it.

Root cause

  • pydantic's experimental MISSING sentinel delegates its repr to typing_extensions.Sentinel in every pydantic version (verified on 2.12.0, 2.12.5, and 2.13.0).
  • typing-extensions 4.16.0 (released 2026-07-02) changed the Sentinel repr from <MISSING> to MISSING.
  • The doctest pins the old repr.

Why only the lowest-direct leg

The default matrix legs install from uv.lock, which pins typing-extensions 4.15.0 (old repr), so they pass. The lowest-direct leg re-resolves: direct dependencies are floored, transitives float to latest. typing-extensions is not a direct dependency of any package, so it floats to 4.16.0 and the doctest fails.

Reproduction from a synced worktree:

uv run --no-sync --with pydantic==2.12.0 --with 'typing_extensions>=4.16' \
  python -m pytest --doctest-modules \
  packages/overture-schema-system/src/overture/schema/system/feature.py -q

One loose end: the base branch's lowest-direct leg still passed on 2026-07-08 with the same uv version (0.11.28), six days after the 4.16.0 release — something else in the resolution graph held typing-extensions below 4.16 that day and has since relaxed. CI logs don't record resolved versions, so the exact delta is unconfirmed; it doesn't change the fix.

Impact

Every branch and PR run of Check Python package code fails the lowest-direct leg until this is fixed, independent of the change under test.

Fix

  1. Update the doctest expectation to the current upstream repr (MISSING).
  2. uv lock --upgrade-package typing-extensions so the default (locked) legs agree with it.
  3. Optionally declare typing-extensions>=4.16 as a direct dependency of overture-schema-system: the sentinel repr is load-bearing for its doctest, so the floor makes the lowest-direct resolution deterministic about it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions