J4 / UPGRADES
← All practice results

p2-07-fastapi-retry

Public GitHub evidence ↗

# p2-07-fastapi-retry — Batch 3 result: RED
Source: nsidnev/fastapi-realworld-example-app @ 029eb7781c60d5f563ee8990a0cbfb79b244538c.
Owned fork: https://github.com/j4groupfounders/j4-p2b-fastapi
Framework: 0.79.1 → 0.142.2.
Preregistration: https://github.com/j4groupfounders/j4-upgrades-harness/commit/8e883215a36bda9737108fe0f6486ab59696c8dc
Baseline: https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37575575915; 90 project tests, no skipped tests.
Terminal evidence: https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37576939733 @ f68327b8460f621c19592c2d72c7124e19f615e6.

## Outcome
**RED** — Stopped early after 6 runs: lifespan repaired and suite reports 90 passes, but original 100% coverage gate remains at 99.67%; six statements in authorization tests uncovered. Upgrade HTTP and seed checks not reached.
6 CI runs, **9.75 actual job-minutes**, **14.60 wall-minutes** (registration to terminal update, includes overlapping waits).
No paid service/model API calls or human edits. Free public-fork Actions. No upstream PRs/issues/contact.
p2-04-fastapi remains RED; p2-07 is an independent registered attempt.

## Migration decisions
ASGI lifespan replaces removed startup/shutdown registration, preserving DB connect/close order. Reused mechanical batch-2 Pydantic/settings/client/dependency repairs. Kept: original missing-credential 403 response (new framework default is 401), explicitly restored in the application auth adapter; no authorization relaxation. Pydantic v2 equality now requires matching model types; migrated one own-test assertion to equality of all model_dump fields, preserving the old v1 value-equality assertion and all 90 tests. Validation error body format drift, if observed, must be classified before acceptance. Zero human edits.
The Python 3.11 test toolchain reported three final assertion lines as uncovered despite all tests passing; coverage 7.6.1 alone did not fix it. Update pytest to 8.3.5 and pytest-asyncio to 0.24.0 with explicit function-scoped fixture loops. Original 100% project coverage threshold retained, not reduced.
Provenance correction: the frozen preregistration Source line uses dd90e049, a J4 baseline commit, not an upstream SHA. The actual upstream application source is nsidnev/fastapi-realworld-example-app at 029eb7781c60d5f563ee8990a0cbfb79b244538c; dd90e049 contains the clean old-version baseline and harness. No preregistration or old result is rewritten.
Coverage diagnostic: materialize the response status in a local variable before the identical 403 assertions in three test files. No expected values, test names, or assertions removed; no coverage exclusions or threshold changes. This checks whether the remaining missed lines are assertion-rewrite source mapping.
STOPPED EARLY after six total CI runs: lifespan startup/shutdown works and pytest reports 90 passed, but original 100% coverage gate is still unmet (99.67% in terminal run). Six statements after requests in three authorization tests remain uncovered, including the explicit status assignments; therefore simple assertion source mapping is NOT established as the cause. Coverage/pytest/asyncio updates did not repair it. The unresolved issue may involve async control flow or instrumentation; do not infer these authorization assertions executed merely from the passing-test count. No coverage waiver, exclusions, skipped tests, or deletions were used. Upgraded HTTP characterization and all five seeded faults were not reached. A new attempt should diagnose the three request/authorization paths before another budget is registered.


## Verification and limitations
Project-only faults caught: NOT REACHED; project plus characterization: NOT REACHED.
Acceptance incomplete; no upgraded HTTP or seeded-fault pass claimed.
Exact independent fault outcomes in seed-results.json; source restored after each mutation.
Each seeded run enforces unchanged test inventory and rejects test/build/infra errors as detection.
No test removal or new skips. See committed baseline and raw terminal surface artifacts for classified framework drift.
Fixed unauthenticated scope only; Vue adds four component fixtures plus pagination events; Spring uses default seeded H2 data and full own-suite Docker integration tests.
No full-app route/line coverage, authenticated frozen-fixture replay or frozen-clock claim. Vue destination 2.7.16 is EOL, not a production-supported recommendation.
Wall minutes overlap across pilots and must not be summed.

## Runs
- [37575575915](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37575575915): success, 1.933 job-min.
- [37575898215](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37575898215): failure, 1.833 job-min.
- [37576142370](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37576142370): failure, 1.233 job-min.
- [37576391810](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37576391810): failure, 1.567 job-min.
- [37576648220](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37576648220): failure, 1.533 job-min.
- [37576939733](https://github.com/j4groupfounders/j4-p2b-fastapi/actions/runs/37576939733): failure, 1.650 job-min.

Stopped branch archived at 64091ee1413e16f259d7f3e54af0fee6a2b63682; the post-run commit only preserves the executed dependency lock, freezes future installs, and documents the stop ([skip ci], no extra verification run). Terminal tested source remains f68327b8460f621c19592c2d72c7124e19f615e6. Exact executed lock is upgrade.poetry.lock.