You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Twelve of the eighteen direct runtime requirements in [project.optional-dependencies]
declare no floor at all. Six do — litestar>=2.15, prometheus-fastapi-instrumentator>=8.0.1, prometheus-client>=0.20, opentelemetry-instrumentation-asgi>=0.46b0, faststream>=0.6, fastmcp>=3.0 — and the rest are bare:
A bare requirement is not a wider range than a floored one; it is a claim that every release
back to the first one works. uv pip install --resolution lowest-direct reads it that way and
resolves fastapi==0.1.0, structlog==0.1.0, sentry-sdk==0.1.0, opentelemetry-{api,sdk}==1.0.0
with opentelemetry-instrumentation==0.19b0, pyroscope-io==0.3.0, orjson==2.0.7.
Core is the case that settles it, because it needs no extra to reproduce. A bare install at
lowest-direct resolves typing-extensions==3.6.2 and does not import:
ImportError: cannot import name 'GenericMeta' from 'typing'
at lite_bootstrap/instruments/base.py:4
typing_extensions.Self (BaseConfig.from_dict/from_object) landed in 4.0.0, and 4.0.0 imports
clean. ADR-0007
argues that dependency is load-bearing and names both uses; the floor those uses imply was never
written down. That is a real undeclared minimum today, independent of any CI work.
Establish the lowest version each bare requirement is actually tested against and declare it, the
way litestar>=2.15 names the two APIs that forced it and #211 established faststream>=0.6 and fastmcp>=3.0 release by release. A floor gets a comment when a specific API forced it, and none
when it is simply the oldest release the suite passes on.
Two things to decide while doing it:
Whether a floor is derived from the library or from the suite.tests/conftest.py imports sentry_sdk.envelope.Envelope and structlog.typing at module level, and the FastStream tests
import faststream._internal.logger.params_storage.ManualLoggerStorage. A floor established by
running the suite is therefore at least as high as the test helpers need, which can exceed the
library's own minimum and over-constrains downstream services. The litestar and fastmcp
floors were derived from library APIs; picking one rule and applying it to all twelve keeps the
set coherent.
The dev and lint groups. They are unfloored too (redis>=5.2.1 is the only exception), which
is why uv lock --resolution lowest-direct fails outright: pytest resolves to 2.0.0 and its
sdist 403s on a 2011 setuptools bootstrap URL. uv lock has no --no-dev or --no-default-groups, so the lock form of Exercise declared dependency floors in CI #210 needs floors here as well, while the per-extra uv pip install form does not. Worth settling alongside, since it decides which form Exercise declared dependency floors in CI #210 can use.
#210 is the job that holds these floors once they exist; it cannot go green before this lands.
Note that nothing enforces a floor at runtime either: import_checker.py is presence-only
(find_spec), so a too-old-but-present dependency passes every guard and fails at attribute access
inside bootstrap() rather than as InstrumentDependencyMissingWarning. The declaration is the
only defence, which is what makes an unwritten one costly.
Revisit trigger: a new call into one of these packages from an instrument or bootstrapper, which
raises the real minimum whether or not the declared floor moves with it.
Twelve of the eighteen direct runtime requirements in
[project.optional-dependencies]declare no floor at all. Six do —
litestar>=2.15,prometheus-fastapi-instrumentator>=8.0.1,prometheus-client>=0.20,opentelemetry-instrumentation-asgi>=0.46b0,faststream>=0.6,fastmcp>=3.0— and the rest are bare:typing-extensionsorjson,sentry-sdk,pyroscope-io,structlog,fastapiopentelemetry-api,opentelemetry-sdk,opentelemetry-instrumentation,opentelemetry-exporter-otlp-proto-grpc,opentelemetry-exporter-otlp-proto-http,opentelemetry-instrumentation-fastapiA bare requirement is not a wider range than a floored one; it is a claim that every release
back to the first one works.
uv pip install --resolution lowest-directreads it that way andresolves
fastapi==0.1.0,structlog==0.1.0,sentry-sdk==0.1.0,opentelemetry-{api,sdk}==1.0.0with
opentelemetry-instrumentation==0.19b0,pyroscope-io==0.3.0,orjson==2.0.7.Core is the case that settles it, because it needs no extra to reproduce. A bare install at
lowest-direct resolves
typing-extensions==3.6.2and does not import:typing_extensions.Self(BaseConfig.from_dict/from_object) landed in 4.0.0, and 4.0.0 importsclean. ADR-0007
argues that dependency is load-bearing and names both uses; the floor those uses imply was never
written down. That is a real undeclared minimum today, independent of any CI work.
Establish the lowest version each bare requirement is actually tested against and declare it, the
way
litestar>=2.15names the two APIs that forced it and #211 establishedfaststream>=0.6andfastmcp>=3.0release by release. A floor gets a comment when a specific API forced it, and nonewhen it is simply the oldest release the suite passes on.
Two things to decide while doing it:
tests/conftest.pyimportssentry_sdk.envelope.Envelopeandstructlog.typingat module level, and the FastStream testsimport
faststream._internal.logger.params_storage.ManualLoggerStorage. A floor established byrunning the suite is therefore at least as high as the test helpers need, which can exceed the
library's own minimum and over-constrains downstream services. The
litestarandfastmcpfloors were derived from library APIs; picking one rule and applying it to all twelve keeps the
set coherent.
redis>=5.2.1is the only exception), whichis why
uv lock --resolution lowest-directfails outright:pytestresolves to 2.0.0 and itssdist 403s on a 2011 setuptools bootstrap URL.
uv lockhas no--no-devor--no-default-groups, so the lock form of Exercise declared dependency floors in CI #210 needs floors here as well, while the per-extrauv pip installform does not. Worth settling alongside, since it decides which form Exercise declared dependency floors in CI #210 can use.#210 is the job that holds these floors once they exist; it cannot go green before this lands.
Note that nothing enforces a floor at runtime either:
import_checker.pyis presence-only(
find_spec), so a too-old-but-present dependency passes every guard and fails at attribute accessinside
bootstrap()rather than asInstrumentDependencyMissingWarning. The declaration is theonly defence, which is what makes an unwritten one costly.
Revisit trigger: a new call into one of these packages from an instrument or bootstrapper, which
raises the real minimum whether or not the declared floor moves with it.