Proactive Triage And Preference Learning
Proactive nudge_decision
proactive_assistant supports action="nudge_decision" to bucket candidate nudges into:
interruptnotifydefer
Routing is deterministic and depends on:
policy:interrupt | defer | adaptivequiet_window_active(explicit arg, otherwise runtime quiet-window policy)- candidate urgency inputs (
severity,due_at,expires_at,interrupt_allowed) - optional
contextinputs (user_busy,conversation_active,presence_confidence) max_dispatchcapacity limit- dedupe suppression window (
dedupe_window_sec, default 600 seconds)
The response returns per-bucket rows plus summary counts and cumulative proactive counters.
When context indicates an active/busy interaction or low presence confidence, non-critical interrupts are downgraded to notify/defer.
Candidates recently dispatched within the dedupe window are downgraded to defer with reason duplicate_recent_dispatch to reduce notification spam.
Preference Learning Loop
Conversation runtime now detects explicit user style directives and updates the active voice profile for:
verbosity(brief | normal | detailed)confirmations(minimal | standard | strict)pace(slow | normal | fast)tone(auto | formal | witty | empathetic | direct)
When memory is enabled, learned profile state is mirrored to memory summaries (voice_profile:<user>). Learned updates are exposed through runtime voice status (preference_learning) and observability intent metrics (preference_update_turns, preference_update_fields).
Safety Boundaries
- Preference learning only triggers on explicit style-oriented directives (not on arbitrary requests).
- High-risk action safeguards remain unchanged (preview/approval gates, policy checks).
- Quiet-hour and policy controls still govern whether proactive actions interrupt or defer.
- Multimodal grounding is advisory for operator transparency and recommendation quality; it does not bypass policy gates.