DL-225
The CommandRegistry contract (frozen contracts-only by DL-152/D5) gains an additive unregister(id: CommandId): void, so a surface removes its registered commands on unmount from the now-app-lifetime shared registry. Load-bearing, not hygiene: without it a board.* command survives Bridge unmount and stays dispatchable at the window-global tier from any route (a stale closure over disposed component state calling store.openAgent). Additive method, no behavior change for existing callers (one implementer, registry.ts); a register()-returns-disposer shape was weighed as the fallback if same-id cross-surface overlap ever becomes reachable (not today — route flips dispose the old surface before the new mounts).
Status: Active (Matt, 2026-08-22)
Record: ../../ui/compass-keyboard-spine-app-root/design.md#a5–bridge-migration-consumer-not-installer