Skip to content

Tighten the gate: format_check in CI, and pyright warnings after the port #134

Description

@JPHutchins

Warning

LLM Disclosure

This issue was filed by claude-opus-5[1m] on behalf of @JPHutchins, who asked that the findings from the smpclient screaming-goblin kickoff session be recorded as issues for durable context. Both gaps were noticed while adding pyright in #127 and deliberately left out of it to keep that PR single-purpose.

Two small gaps in what the gate actually catches.

1. Unformatted code can land

Config(github_task=check) where check = Parallel(lint, typecheck, test). Nothing there verifies formatting — ruff check catches import ordering via the I rule, but not formatting. Only the mutating all = Sequential(format, check) formats, and CI never runs it.

smp's equivalent task includes a non-mutating format_check leaf:

format_check = Task("uv run ruff format --check {paths}", paths=".")
check = Parallel(format_check, lint, typecheck, test)

The tree is currently formatted, so adding this should be green immediately.

2. pyright warnings do not gate

#127 added pyright, but it only fails the build on errors. generics.py currently emits 8 reportInvalidTypeVarUse warnings (Protocol TypeVars that should be covariant) which pass CI silently, and any new warning would too.

Those 8 are expected to disappear with the smp port — smp's SMPRequest already has the correct covariance, and smpclient.generics is reshaped by #124 — so the sequencing is: land the port first, then tighten. Tightening is either pyright --warnings or promoting specific rules in [tool.pyright].

3. Deprecation reporting — not needed

Originally filed as a third item, on the assumption that #124 would ship a deprecated
re-export layer. @JPHutchins settled it the other way: screaming-goblin is the
breaking release, so smpclient.requests is deleted outright rather than deprecated.
Nothing to enable.

Keeping the measurement, since it will come up again

Measured on this tree, in case a future release does want a deprecation window:

Signal mypy pyright
@deprecated class (PEP 702) silent by default; errors with --enable-error-code=deprecated silent in standard mode; errors with reportDeprecated
plain alias (X = smp.Y) no signal no signal

Two consequences worth remembering: a bare re-export alias cannot be marked deprecated at
all (there is nothing to decorate — it needs a real class or function), and neither checker
reports @deprecated unless explicitly opted in. So a deprecation nobody enabled is a
deprecation nobody sees.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions