Part of EPIC #554. Implemented — under review in #687.
Shared AbstractServiceRegistrar<S> base: per-bundle registry discovery, bridge creation, OSGi service publication (whiteboard-tracked by core), tracked unregistration with per-entry error isolation. One registrar component per extension type; a future extension point is one subclass + one typed library wrapper. The legacy render-filter bridging was migrated onto the mechanism (its declared priority is now honored — changelog-noted behavior change) and got a typed registerRenderFilter() API, with async callbacks supported (#688).
Decisions: ADR-0001 (mechanism, whiteboard alignment), ADR-0002 (first-class registry types), ADR-0003 (typed TS wrappers + java escape hatch).
Tests: AbstractServiceRegistrar unit tests; existing render-filter e2e stays green.
Part of EPIC #554. Implemented — under review in #687.
Shared
AbstractServiceRegistrar<S>base: per-bundle registry discovery, bridge creation, OSGi service publication (whiteboard-tracked by core), tracked unregistration with per-entry error isolation. One registrar component per extension type; a future extension point is one subclass + one typed library wrapper. The legacy render-filter bridging was migrated onto the mechanism (its declaredpriorityis now honored — changelog-noted behavior change) and got a typedregisterRenderFilter()API, with async callbacks supported (#688).Decisions: ADR-0001 (mechanism, whiteboard alignment), ADR-0002 (first-class registry types), ADR-0003 (typed TS wrappers +
javaescape hatch).Tests: AbstractServiceRegistrar unit tests; existing render-filter e2e stays green.