1784eedd3f
The SDK fires OnTimedUnshelve with the node manager's system context (no session, no user identity) when a TimedShelve duration expires. Routing through the shared HandleAlarmCommand hit the AlarmAck gate and returned BadUserAccessDenied, leaving the alarm permanently shelved. Replace the delegated HandleAlarmCommand call with an inline lambda that bypasses the client gate, extracts the AlarmId the same way, and routes an Unshelve command so the engine clears its shelve state. The manual-client Unshelve path via OnShelve(shelving:false) remains gated. Update the AlarmCommandRouterTests OnTimedUnshelve test to use a real system context (no UserIdentity) — reproducing the actual SDK invocation path — and assert Good, AlarmId, Operation==Unshelve, User==empty. Add a doc note to AlarmCommand.Operation that Enable/Disable are in the vocabulary but not yet wired at the node-manager seam.