You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Map.values() is a live mutable collection view. A caller that obtains all() can invoke remove(...), removeIf(...), clear(), or iterator removal and thereby mutate registry/discovery authority without passing through register(...) or any future identity validation. This is a separate invariant from duplicate-ID rejection in #203.
Current sequencing / writer lease
Status: known_gap, source mutation defer_until_trigger. Active PR #156 currently owns TargetConnectorRegistry for Qlik scaffold retirement and must not be raced. After #156 stabilizes/integrates or the target-registry writer lease otherwise clears, re-read the exact registry surface before implementing this issue. Coordinate with #203 so the two integrity fixes do not create competing branches over the same file.
Technical root cause: read-only discovery semantics and mutable registry storage share the same collection object.
Control failure: existing connector catalog/registry tests do not assert that enumeration cannot mutate registry state.
Impact: in-process callers/plugins can silently remove connector authority, change later discovery results, and make behavior depend on who retained a collection view.
Test-first acceptance after the writer lane clears
Add a failing test against the real TargetConnectorRegistry before production changes.
Prove mutation attempts through the all() result cannot change registry contents or order. Cover at least direct clear/remove or iterator removal.
Return an immutable snapshot or equivalent read-only collection with deterministic iteration order. Prefer a snapshot over a live view so later legitimate registry changes cannot retroactively change an already-returned enumeration unless the API explicitly documents that behavior.
Preserve existing connector object identity and lookup/catalog ordering; do not clone connector instances.
Add beginner-readable public Javadoc for the enumeration semantics if not already supplied by the accepted registry repair.
Run focused/full ETL tests plus current dependency/SBOM/SAST/security evidence and require non-vacuous owned-production coverage before protected integration.
Non-goals
No new plugin lifecycle, priority system, concurrent dynamic registration contract, provider implementation, credential change, or cross-repository mutation.
Product/integrity gap
Protected
develop@622e5e6c3d534f230c390f10e3832efadfc01825exposes the backingTargetConnectorRegistrythrough:Map.values()is a live mutable collection view. A caller that obtainsall()can invokeremove(...),removeIf(...),clear(), or iterator removal and thereby mutate registry/discovery authority without passing throughregister(...)or any future identity validation. This is a separate invariant from duplicate-ID rejection in #203.Current sequencing / writer lease
Status:
known_gap, source mutationdefer_until_trigger. Active PR #156 currently ownsTargetConnectorRegistryfor Qlik scaffold retirement and must not be raced. After #156 stabilizes/integrates or the target-registry writer lease otherwise clears, re-read the exact registry surface before implementing this issue. Coordinate with #203 so the two integrity fixes do not create competing branches over the same file.RCA
byId.values()directly.Test-first acceptance after the writer lane clears
TargetConnectorRegistrybefore production changes.all()result cannot change registry contents or order. Cover at least directclear/removeor iterator removal.Non-goals
No new plugin lifecycle, priority system, concurrent dynamic registration contract, provider implementation, credential change, or cross-repository mutation.