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
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-goblinis 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.
Warning
LLM Disclosure
This issue was filed by
claude-opus-5[1m]on behalf of @JPHutchins, who asked that the findings from the smpclientscreaming-goblinkickoff 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)wherecheck = Parallel(lint, typecheck, test). Nothing there verifies formatting —ruff checkcatches import ordering via theIrule, but not formatting. Only the mutatingall = Sequential(format, check)formats, and CI never runs it.smp's equivalent task includes a non-mutating
format_checkleaf: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.pycurrently emits 8reportInvalidTypeVarUsewarnings (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
SMPRequestalready has the correct covariance, andsmpclient.genericsis reshaped by #124 — so the sequencing is: land the port first, then tighten. Tightening is eitherpyright --warningsor promoting specific rules in[tool.pyright].3.
Deprecation reporting— not neededOriginally filed as a third item, on the assumption that #124 would ship a deprecated
re-export layer. @JPHutchins settled it the other way:
screaming-goblinis thebreaking release, so
smpclient.requestsis 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:
@deprecatedclass (PEP 702)--enable-error-code=deprecatedstandardmode; errors withreportDeprecatedX = smp.Y)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
@deprecatedunless explicitly opted in. So a deprecation nobody enabled is adeprecation nobody sees.