Problem
pyproject.toml:31 declares otel = ["opentelemetry-api>=1.43.0"]. That floor was never a requirement of the code: it arrived as a routine dependency bump (3d664ad, "chore: bump opentelemetry-api from 1.42.1 to 1.43.0 (#7)") that moved the dev pin, the extra's lower bound and the extras-min pin (.github/workflows/ci.yml:105) together. A dev pin says "what we develop against"; an extra's floor says "the oldest version we support" — the bump silently answered the second question with the first.
OTelEventListener uses only metrics.get_meter, Meter.create_histogram and Meter.create_counter (interlock/integrations/otel.py:31-56) — API that has been stable for years. Verified locally: every hook of OTelEventListener runs unchanged on opentelemetry-api==1.20.0 and on 1.35.0.
The cost to adopters is real, because the OpenTelemetry distro/instrumentation line pins the whole stack to one API version. opentelemetry-distro==0.56b0 resolves opentelemetry-sdk==1.35.0 and therefore opentelemetry-api==1.35.0; interlock-cb[otel] then forces a choice between upgrading the entire OTel stack and skipping the extra — for a listener that would have worked fine. Every other extra carries a floor that means something (requests>=2.31.0, httpx>=0.27.0, aiohttp>=3.12.0 for the client-middleware API, litestar>=2.23.0 for NamedDependency); this one does not.
Proposal
- Lower the
otel extra floor to the oldest opentelemetry-api the listener actually works on, and pin extras-min to the same version so CI proves it on 3.11. 1.20.0 is verified here; go lower only if the job stays green.
- Keep the dev group on the current version — development continues against the latest.
- Prevent the recurrence: a runtime floor is a compatibility statement, not a dev pin. Either exclude
[project.optional-dependencies] from the uv updates in .github/dependabot.yml, or state the rule in CONTRIBUTING.md next to the extras workflow so a floor is only ever raised by an API the code needs.
Acceptance criteria
- The
otel extra floor is lowered and .github/workflows/ci.yml pins extras-min to the same version; tests/test_otel.py passes there.
- The dev group keeps the current
opentelemetry-api version, so the main matrix still tests the latest.
- The "never raise an extra's floor without an API reason" rule is written down where the next bump will be reviewed.
- Audit the remaining extras' floors in the same PR and note any that are equally accidental.
CHANGELOG.md entry under [Unreleased] (Changed), phrased for the adopter it unblocks.
Non-goals
- Supporting the pre-stable metrics API or adding compatibility shims: if a floor cannot be met without branching on the OTel version, keep the floor.
Problem
pyproject.toml:31declaresotel = ["opentelemetry-api>=1.43.0"]. That floor was never a requirement of the code: it arrived as a routine dependency bump (3d664ad, "chore: bump opentelemetry-api from 1.42.1 to 1.43.0 (#7)") that moved the dev pin, the extra's lower bound and theextras-minpin (.github/workflows/ci.yml:105) together. A dev pin says "what we develop against"; an extra's floor says "the oldest version we support" — the bump silently answered the second question with the first.OTelEventListeneruses onlymetrics.get_meter,Meter.create_histogramandMeter.create_counter(interlock/integrations/otel.py:31-56) — API that has been stable for years. Verified locally: every hook ofOTelEventListenerruns unchanged onopentelemetry-api==1.20.0and on1.35.0.The cost to adopters is real, because the OpenTelemetry distro/instrumentation line pins the whole stack to one API version.
opentelemetry-distro==0.56b0resolvesopentelemetry-sdk==1.35.0and thereforeopentelemetry-api==1.35.0;interlock-cb[otel]then forces a choice between upgrading the entire OTel stack and skipping the extra — for a listener that would have worked fine. Every other extra carries a floor that means something (requests>=2.31.0,httpx>=0.27.0,aiohttp>=3.12.0for the client-middleware API,litestar>=2.23.0forNamedDependency); this one does not.Proposal
otelextra floor to the oldestopentelemetry-apithe listener actually works on, and pinextras-minto the same version so CI proves it on 3.11.1.20.0is verified here; go lower only if the job stays green.[project.optional-dependencies]from the uv updates in.github/dependabot.yml, or state the rule inCONTRIBUTING.mdnext to the extras workflow so a floor is only ever raised by an API the code needs.Acceptance criteria
otelextra floor is lowered and.github/workflows/ci.ymlpinsextras-minto the same version;tests/test_otel.pypasses there.opentelemetry-apiversion, so the main matrix still tests the latest.CHANGELOG.mdentry under[Unreleased](Changed), phrased for the adopter it unblocks.Non-goals