Lifecycle Overview¶
The compatibility lifecycle begins when a caller still relies on an agentic_proteins import, command, or optional extra. The bridge resolves that historical surface to the canonical runtime object and preserves observable behavior while the caller migrates.
stateDiagram-v2
[*] --> HistoricalUse
HistoricalUse --> Forwarded: bridge resolves canonical owner
Forwarded --> Verified: identity and behavior checks pass
Verified --> CanonicalUse: caller adopts runtime import
CanonicalUse --> [*]
Forwarded --> Incompatible: contract cannot be preserved
Incompatible --> MigrationRequired
MigrationRequired --> CanonicalUse
Resolution path¶
At the package root, public objects are loaded lazily from bijux_proteomics_runtime. Compatibility modules follow the same principle: route to the canonical implementation rather than wrap it with new semantics. Object identity matters for public classes and callables because exception handling, type checks, plugin registration, and introspection can all break when a bridge creates look-alike objects.
The command and HTTP paths must converge on the same runtime behavior as canonical entrypoints. Optional dependencies remain explicit: a historical extra should enable the matching runtime extra or fail with actionable dependency information.
Change lifecycle¶
A runtime contract change is reviewed against both canonical and compatibility surfaces. If forwarding remains exact, the bridge changes only where the historical path requires it. If exact compatibility is impossible, the migration must be documented as a consumer-visible break; the bridge must not silently reinterpret arguments, results, state, or artifacts.
The desired endpoint is direct use of bijux_proteomics_runtime. Historical access can remain available for supported releases, but new applications should not build fresh dependencies on the compatibility namespace.
Evidence at each transition¶
| Transition | Required record | Stop condition |
|---|---|---|
| historical use to forwarded | surface inventory and canonical destination | no canonical owner or undocumented translation |
| forwarded to verified | identity or adapter contract, positive path, negative path, and retained artifact comparison | different defaults, outcomes, state, errors, or artifacts |
| verified to canonical use | consumer change, consumer integration result, and canonical run evidence | caller still depends on historical import, executable, extra, or transport behavior |
| canonical use to retirement-ready | remaining-caller inventory, supported release decision, and removal impact | unknown callers or retained data still require bridge code |
| retirement-ready to removed | synchronized package, documentation, test, build, and release changes | any historical surface remains accidentally importable or advertised |
Verification is surface-specific. Root object identity does not prove nested HTTP behavior; help parity does not prove state or artifact parity; a clean repository search does not prove external caller migration.
Retirement closure¶
flowchart TD
inventory["surface and caller inventory"] --> replacement{"canonical replacement complete?"}
replacement -->|no| supported["keep the affected surface supported"]
replacement -->|yes| parity{"consumer and retained-state evidence complete?"}
parity -->|no| supported
parity -->|yes| decision["record removal decision and release window"]
decision --> remove["remove package surface, tests, docs, and packaging contract together"]
remove --> negative["prove historical access is absent"]
Closure means the caller no longer needs the bridge and the canonical record can be interpreted without it. A warning, deprecation date, or successful canonical smoke test is not closure evidence by itself.