D14-2 (#1584) moved the navigation store core into the package verbatim, so it kept two shapes the D5/D6 cores deliberately do not have:
NavigationClient = Pick<AppwireClientLike, "connect" | "request" | "onNotification" | "onReady">: init() calls client.connect() when no initialize is handed in (store.ts:806-814) and subscribes to client.onReady itself to detect reconnects/generation changes (:759-805). D5/D6 expose beginReadyGeneration/endReadyGeneration/detachHub and let the adapter drive them from connectionStore; the web host (notifications/index.ts:132-142) already tracks readiness and only calls initNavigation(client) once ready, so the core re-derives what the host knows.
awaitConvergence (:830-893) with its own setTimeout, NAVIGATION_INVALIDATION_TIMEOUT_MS = 10s and rearm loop has one caller, the web's shutdownConvergence.ts; the bound is shutdown UX policy, not a navigation invariant, and everything it needs is public except the private isNavigationNotInitialized matcher.
Neither belonged in #1584 (its contract was "core unchanged, oracle byte-identical"). Pay before building any second adapter on this core: host-driven generation lifecycle in the D5 shape (port shrinks to request + onNotification), and decide whether the convergence timer moves to the web's shutdown flow with the matcher exported. Also: awaitNavigationTargets (:132, :542-545) has no production caller (two test files only) and crossed into the public API with the move. Found by the /simplify altitude pass on #1584.
D14-2 (#1584) moved the navigation store core into the package verbatim, so it kept two shapes the D5/D6 cores deliberately do not have:
NavigationClient = Pick<AppwireClientLike, "connect" | "request" | "onNotification" | "onReady">:init()callsclient.connect()when noinitializeis handed in (store.ts:806-814) and subscribes toclient.onReadyitself to detect reconnects/generation changes (:759-805). D5/D6 exposebeginReadyGeneration/endReadyGeneration/detachHuband let the adapter drive them fromconnectionStore; the web host (notifications/index.ts:132-142) already tracks readiness and only callsinitNavigation(client)once ready, so the core re-derives what the host knows.awaitConvergence(:830-893) with its ownsetTimeout,NAVIGATION_INVALIDATION_TIMEOUT_MS= 10s and rearm loop has one caller, the web'sshutdownConvergence.ts; the bound is shutdown UX policy, not a navigation invariant, and everything it needs is public except the privateisNavigationNotInitializedmatcher.Neither belonged in #1584 (its contract was "core unchanged, oracle byte-identical"). Pay before building any second adapter on this core: host-driven generation lifecycle in the D5 shape (port shrinks to request + onNotification), and decide whether the convergence timer moves to the web's shutdown flow with the matcher exported. Also:
awaitNavigationTargets(:132, :542-545) has no production caller (two test files only) and crossed into the public API with the move. Found by the /simplify altitude pass on #1584.