# Contributor handoff — encode/starlette

> Canonical page: https://codevetter.com/unpack/starlette/agent-handoff

# Contributor handoff — encode/starlette

Scanned commit 4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423 (2026-10-01). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

This brief is based on bounded source inspection at the requested commit; tests, benchmarks, and CI were inspected, not executed. Start edits from the ASGI contract and the relevant implementation/test pair, then follow cross-module state and message ownership. Preserve differences between standalone components, composed applications, and server-supported extensions. Existing repository scripts define future validation, but the current task authorizes read-only inspection only.
- Use tests and workflow definitions as intended checks, not passing evidence: this investigation executed neither tests nor CI. TestClient invokes the application in process and buffers output, so its assertions have a different boundary from deployed server validation. — [scripts/test#L1-L13](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/test#L1-L13) [.github/workflows/main.yml#L33-L47](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/.github/workflows/main.yml#L33-L47) [starlette/testclient.py#L348-L376](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/testclient.py#L348-L376)
- Read types.py, applications.py, routing.py, requests.py, responses.py, and exception handling before cross-cutting changes; preserve ASGI scope mutation, lazy stack construction, and the response-start barrier. — [starlette/types.py#L12-L26](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/types.py#L12-L26) [starlette/applications.py#L63-L96](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/applications.py#L63-L96) [starlette/routing.py#L678-L709](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/routing.py#L678-L709) [starlette/_exception_handler.py#L31-L63](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/_exception_handler.py#L31-L63)
- Routing edits must retain first-full-match precedence, partial-match 405 handling, slash redirects, mount root_path semantics, and reverse URLs; synthetic routing benchmarks provide early/late/miss/wrong-method scenarios for later authorized measurement. — [starlette/routing.py#L396-L451](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/routing.py#L396-L451) [starlette/routing.py#L688-L728](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/routing.py#L688-L728) [benchmarks/routing_benchmark.py#L44-L71](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/benchmarks/routing_benchmark.py#L44-L71)
- For request/upload changes, review stream reuse, total limits versus spool thresholds, worker-thread rollover, and cleanup on stream or disk failure; prioritize tests/test_requests.py, tests/test_formparsers.py, and tests/middleware/test_body_limit.py in a later executable task. — [starlette/requests.py#L234-L266](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/requests.py#L234-L266) [starlette/formparsers.py#L149-L191](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/formparsers.py#L149-L191) [tests/test_formparsers.py#L349-L365](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/tests/test_formparsers.py#L349-L365) [tests/middleware/test_body_limit.py#L76-L141](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/tests/middleware/test_body_limit.py#L76-L141)
- Middleware changes require both HTTP and non-HTTP scope review; BaseHTTPMiddleware has a documented-in-test context propagation limitation, while session persistence and file delivery require their own mutation/header and containment/range checks. — [starlette/middleware/base.py#L96-L109](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/middleware/base.py#L96-L109) [tests/middleware/test_base.py#L229-L251](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/tests/middleware/test_base.py#L229-L251) [tests/middleware/test_session.py#L248-L289](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/tests/middleware/test_session.py#L248-L289) [tests/test_staticfiles.py#L606-L656](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/tests/test_staticfiles.py#L606-L656)
- Follow uv.lock and scripts/install's frozen synchronization; preserve strict mypy and Ruff's 120-character line policy, and test optional dependency/import behavior when changing integrations, including TestClient's httpx2 preference and deprecated httpx fallback. — [scripts/install#L1-L5](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/install#L1-L5) [uv.lock#L1-L13](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/uv.lock#L1-L13) [pyproject.toml#L89-L111](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/pyproject.toml#L89-L111) [starlette/testclient.py#L26-L45](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/testclient.py#L26-L45)
- For later authorized verification, the direct targeted form is uv run coverage run -m pytest <test-file>; scripts/test additionally invokes scripts/check and the global 100% coverage report outside GitHub Actions. A targeted run alone may not satisfy that global threshold. — [scripts/test#L5-L13](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/test#L5-L13) [scripts/check#L3-L10](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/check#L3-L10) [scripts/coverage#L1-L5](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/coverage#L1-L5) [pyproject.toml#L126-L134](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/pyproject.toml#L126-L134)
- Documentation headings require explanatory text before snippets; version authority is starlette/__init__.py and sync-version compares it with release notes. Contributing docs contain stale examples naming tests/test_application.py and __version__.py, so verify actual tracked paths before following examples or release instructions. — [AGENTS.md#L1-L3](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/AGENTS.md#L1-L3) [starlette/__init__.py#L1-L1](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/starlette/__init__.py#L1-L1) [scripts/sync-version#L3-L9](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/scripts/sync-version#L3-L9) [docs/contributing.md#L64-L70](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/docs/contributing.md#L64-L70) [docs/contributing.md#L153-L158](https://github.com/encode/starlette/blob/4e7fc04e5f2c69f60e418ff2107d0f6d9a0fe423/docs/contributing.md#L153-L158)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
