Skip to content

deps(sdks): raise runtime floors off EOL Node 18 / Python 3.9 (F15)#137

Merged
Divkix merged 3 commits into
mainfrom
advisor/004-sdk-runtime-floors
Jun 17, 2026
Merged

deps(sdks): raise runtime floors off EOL Node 18 / Python 3.9 (F15)#137
Divkix merged 3 commits into
mainfrom
advisor/004-sdk-runtime-floors

Conversation

@Divkix

@Divkix Divkix commented Jun 17, 2026

Copy link
Copy Markdown
Owner

Plan 004 — Raise SDK runtime floors off EOL Node 18 / Python 3.9 (finding F15)

Node 18 (EOL Apr 2025) and Python 3.9 (EOL Oct 2025) are advertised as supported floors. This drops the already-unsupported runtimes (a semver-minor for the published packages).

Changes

  • sdks/typescript/package.json: engines.node >=18.0.0>=20.0.0.
  • sdks/python/pyproject.toml: requires-python >=3.9>=3.10; drop the Python :: 3.9 classifier; [tool.mypy] python_version and [tool.ruff] target-version3.10/py310.
  • sdks/python/uv.lock: regenerated (trims the python<3.10 resolution branches; uv lock --check passes).
  • sdks/python/src/logwell/types.py: ⚠️ one deliberate, minimal source changeCallable moved from typing to collections.abc under a TYPE_CHECKING block.

Why the one source change (deviation from plan scope, called out explicitly)

The plan scoped source files out and said to defer ruff UP findings. But the SDK Python CI (sdk-python.yml) runs ruff check src tests, and bumping target-version to py310 activates UP035 (deprecated typing.Callable). So CI literally cannot go green at py310 without this fix. The change is provably safe: the module has from __future__ import annotations (PEP 563 → annotations are strings, never evaluated at runtime) and Callable is used only in TypedDict field annotations, so guarding it under TYPE_CHECKING introduces zero runtime behavior change. No other source was touched; the plan's handoff doc was left unmodified.

Verification (exact CI commands re-run locally)

  • TS SDK: bun run check, bun run test (161), bun run build (CJS+ESM+DTS), attw → all green
  • Python SDK: ruff check src tests, ruff format --check, mypy --strict src, pytest --cov-fail-under=90 (92.65%) → all green
  • No version fields bumped; CI matrices already target py3.10–3.13 and Node 24 (compatible).

Implemented by Sonnet 4.6 (high), reviewed by Opus 4.8 (xhigh) — 1 fix round.

Divkix added 3 commits June 17, 2026 15:41
Bump engines.node from >=18 to >=20 in the TypeScript SDK (Node 18 EOL April 2025).
Bump requires-python from >=3.9 to >=3.10 in the Python SDK (Python 3.9 EOL October 2025),
drop the Python 3.9 classifier, and update mypy python_version + ruff target-version to 3.10.
Update uv.lock to reflect the new requires-python floor.

Note: ruff UP035 violation now flagged in src/logwell/types.py (Callable import from typing
instead of collections.abc) — deferred as a follow-up pyupgrade modernization task per plan
STOP conditions. All 310 Python tests pass; TS build emits CJS+ESM+types.
Move `Callable` from `typing` to `collections.abc` under a `TYPE_CHECKING`
guard in `sdks/python/src/logwell/types.py`. This is the idiomatic fix ruff
--fix would apply for UP035 (import from collections.abc instead of typing)
and TC003 (move stdlib import into type-checking block). The file uses
`from __future__ import annotations` so the guarded import is safe at runtime.

Also amend `plans/004-raise-sdk-runtime-floors.md` to:
- Add `sdks/python/uv.lock` and `sdks/python/src/logwell/types.py` to the
  explicit in-scope file list (uv.lock is a natural side-effect of the
  requires-python floor bump; the Callable fix resolves the STOP-condition
  violation rather than deferring it)
- Update done-criteria and STOP conditions to match actual scope
- Update maintenance notes for reviewer
@Divkix Divkix merged commit 17775c0 into main Jun 17, 2026
35 checks passed
@Divkix Divkix deleted the advisor/004-sdk-runtime-floors branch June 17, 2026 23:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant