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
- Update the doctest expectation to the current upstream repr (
MISSING).
uv lock --upgrade-package typing-extensions so the default (locked) legs agree with it.
- 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.
What happened
The
Check (lowest-direct, py3.10)job failed on PR #551 (run) on a doctest inoverture.schema.system.feature.Feature:The PR's diff (12 file deletions, no dependency surface) is unrelated; the failure reproduces without it.
Root cause
MISSINGsentinel delegates its repr totyping_extensions.Sentinelin every pydantic version (verified on 2.12.0, 2.12.5, and 2.13.0).<MISSING>toMISSING.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 -qOne 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 codefails the lowest-direct leg until this is fixed, independent of the change under test.Fix
MISSING).uv lock --upgrade-package typing-extensionsso the default (locked) legs agree with it.typing-extensions>=4.16as a direct dependency ofoverture-schema-system: the sentinel repr is load-bearing for its doctest, so the floor makes the lowest-direct resolution deterministic about it.