Repository navigation
v0.11.1
Docs
- Capability boundaries rewritten as the full input/output matrix:
a structured-inputs table (path convertors, query models, body shapes,
Depends, scalars, alias wire contract), two new degradation rows (unbound
TypeVar at a route boundary, unannotated body parameters), mixed-type
Literal in the skip list, and a "Conventions the bridge follows" table
collecting the FastAPI-side derivation rules (tags/domains, function
names, descriptions, requiredness per model family, exclude/deprecated,
optional headers, multi-verb priority, naming collisions).
Fixed
- TypeVar-degraded routes now carry the real reason in their SDL note.
Route-output classification runs ONCE at scan time
(scanner.OutputPlan) and every reader — startup notice, readiness
report, SDL field note — consumes the same plan, ending five verified
disagreements between the three former detectors: the misleading
"declares no response type" guidance on generic routes, first-match
audit vs stacked SDL notes, void+filter audited as degraded (a bodyless
response has nothing to filter), Any+filter showing two different
stories, and the filter⇒JSON decision smeared across four sites.
Changed
-
Input/output handling systematically reorganized (four refactors,
zero behavior change beyond the fix above):- type_builder's six near-clone field builders (model/TypedDict/
dataclass × input/output) unified onFieldSpec: three family
extractors produce normalized field records, one_build_fields
loop owns sanitize/wire-key/degrade/union/empty handling that was
copy-pasted six times (1052 → 1041 lines while gaining the
abstraction) _build_route_info(158 lines) decomposed into a gate sequence
(_FlatParams, five named gates,_route_params,_trial_route_types)
with_make_paramas the single ParamInfo/gname producer- wire-name/default/note helpers single-sourced (
request_wire_name,
output_wire_name,graphql_default,append_note); all three
cross-module private imports made public or moved home
- type_builder's six near-clone field builders (model/TypedDict/
-
Test suite reorganized into layers.
tests/now mirrors altitude
instead of git history:unit/(one module under test, no handler
execution),integration/(throughRouterGraphQLHandler),
e2e/(ASGI / fastmcp Client),guards/(meta pins), plus a shared
tests/support/package (sample models, app factories, MCP/HTTP
protocol helpers) that replaces ~19 copy-pasted factories and
per-file model redefinitions. Amake_handlerconftest fixture owns
handler lifecycle. Four assertion-level duplicates merged
(filter_passthrough_headers ×2, introspection, list-type, path-param
restatement); layered assertions deliberately kept. Ticket-wave labels
(G5-G11/H1/M1, P0-2, R1/R4, B1, O1/O2, D1) moved from names and
section markers into docstrings.
Added
- Seventeen gap tests lift coverage from 95.1% to 96.7%:
unknown-domain errors for the remaining progressive tools, fragment
arms of the unroll-limit walk, HEAD/OPTIONS-only routes, empty
TypedDict/dataclass input raises, output-side AliasChoices fallback,
input-side hyphenated TypedDict keys, dataclass field degradation on
both sides, non-JSON 2xx bodies, long error-body truncation, and
syntax errors on the unguarded parse path.