rl-spring

Activation safety

This defines the startup contract tested by ActivationSafetyTest. See the usage guide for application setup.

Contract

Verification approach

Against main 4b9a894, the first 16 test cases produced eight assertion failures (no test errors):

Finding Reproduction Required correction
Global opt-in bypass A supplied client triggers adapters without enabled=true; startup fails without support beans, or enables protection if they are supplied. Gate every automatic integration on the global flag.
Metrics disablement breaks startup observation.enabled=false leaves enforcers without a recorder. Supply the default recorder in no-op mode.
Unsupported protection accepted Three webflux.* configurations bind successfully but install no protection. Remove the inert properties and empty configuration.
Ambiguous admission advice An unrelated MethodInterceptor makes advisor injection ambiguous. Select the named RateLimitly interceptor explicitly.

The follow-up primary-advice test also fails without the qualifier: an unrelated pass-through interceptor marked @Primary replaces the admission advice, so the protected call returns without asking the rejecting client. This is an admission bypass, not just a startup problem.

The expanded suite has 20 activation cases covering the fixes and surrounding contracts, including independent latency reporting with metrics disabled, named advice overrides, both directions of typed resolver overrides, and servlet-free method protection. At this first activation step, the full Maven reactor passed 59 tests; the HTTP lifecycle work expands that coverage. The activation cases use a stub client and local test contexts: no DNS, real credentials, or running server is required. Cross-platform PR CI and exact merged-main CI remain gates before completing this readiness step.

This work does not complete the behavior/security audit. HTTP dispatch and completion have a separate contract and regression suite. Nested method calls, the full failure/reporting matrix, measurement suitability, expression/logging boundaries, and full optional-dependency/ownership checks remain in issue #9. No publication or visibility change is part of this change.