Skip to content

feat: v0.8.0 β€” Verification Debt

Choose a tag to compare

@ddsha441981 ddsha441981 released this 20 Jul 16:29
· 83 commits to main since this release
8fdb661

v0.8.0 β€” Verification Debt

Closes the original design plan's unfinished verification checks (Β§3) before the v1.0.0 API freeze turns their answers into contracts β€” plus a CI-flakiness fix found during real-world gate
validation.

🌊 WebFlux/reactive validation (plan Β§3 check #4 β€” never done until now)

  • New WireDoctorWebFluxIntegrationTest boots a REACTIVE (Netty, non-servlet) context in CI and asserts reports are written, startup timings populated, and ghost analysis runs
  • Reactive entry points added to ghost detection: WebHandler, WebSocketHandler, WebExceptionHandler (joining RouterFunction) β€” fixes ghost false-positives in reactive apps
  • Pinned by test: a RouterFunction bean is never flagged as a ghost
  • spring-boot-starter-webflux added test-scope only; README supported-versions note added

πŸ”¬ Bean-scope behavior pinned by tests (plan Β§3 check #2 β€” doc-only until now)

  • New WireDoctorBeanScopeTest asserts the documented behavior per scope:
    • prototype definitions appear as graph nodes but are never instantiated (zero-intrusion promise, now regression-tested)
    • untouched @Lazy beans survive the full analysis untouched
    • FactoryBean product edges resolve to the factory's bean name
    • skipped not-instantiated beans are honestly counted (proxies.notInstantiatedSkipped)
  • README Limitation #5 rewritten from vague ("may not fully map out") to these test-backed facts

🀝 Never overwrite a user-set ApplicationStartup (found in plan audit)

  • The startup listener previously replaced any ApplicationStartup the app (or another tool) had installed β€” silently breaking foreign instrumentation
  • Now: a pre-existing non-default instance is kept. Buffering ones keep timings working (INFO); foreign ones get a WARN and the timing section degrades gracefully while every other
    analysis runs normally
  • getApplicationStartup() verified available on Boot 2.7 β†’ 4.0 (same floor as BufferingApplicationStartup)
  • Contract pinned by WireDoctorStartupCoexistenceTest

⏱️ Slow-bean gate jitter margin β€” wiredoctor.slow-bean-margin-ms (default 20)

  • Real-world validation on start.spring.io tripped the gate at 101ms vs a 100ms threshold β€” pure JVM jitter, not a regression. That exact case is now a permanent test
  • A NEW slow bean must exceed threshold + margin to trip; beans inside the margin band stay in the report's slow-bean list but never fail CI
  • Mirrors the dual-threshold noise tolerance the startup-time gate already has; 0 restores exact pre-0.8.0 behavior
  • Margin surfaces in gates.config and the HTML gate card ((+20ms jitter margin))
  • Docs: docs/performance-gates.md + README config section updated

Verified

  • 233 tests green (222 autoconfigure + 11 actuator) via full mvn verify β€” up from 219
  • ~60 lines production code, ~350 lines tests β€” code-light, proof-heavy by design
  • Version bumped in all 4 poms; CHANGELOG entry added

Plan Β§3 checklist after this PR

Check Status
#1 SPI hook timing βœ… resolved v0.1.0 + CI matrix
#2 Bean scopes βœ… this PR
#3 AOT/native β†’ v1.0.0 (deliberate, task 3)
#4 WebFlux βœ… this PR