{ "_description": "Gemini action dispatch — maps spoken phrases to canonical motion commands. Mirrors Sanad's scripts/sanad_arm.txt pattern (Project/Sanad/scripts/sanad_arm.txt) but in JSON with action groups instead of a Python-set file. When stt.backend='gemini', Voice/marcus_voice.py::_dispatch_gemini_command matches the user's transcript (after stripping 'Sanad') against 'phrases' under each action and fires on_command with the action's 'canonical' string. Edit this file to add new spoken variants WITHOUT touching code.", "_format": "actions..phrases — array of spoken variants (lowercase, punctuation stripped). Match is whole-word, case-insensitive. One phrase hit = fire.\nactions..canonical — the string passed to self._on_command(text, 'en'). Must be a recognised command in Brain/command_parser.py.\nactions..description — human-only; dispatcher ignores it.\nNon-motion conversation ('how are you', 'who are you', 'what do you see') is NOT listed here — Gemini answers those naturally via voice. Only physical actions live in this file.", "settings": { "_comment": "Dispatcher behaviour. require_wake_word=true means the transcript must contain 'Sanad' (or a fuzzy variant from stt.wake_words) before any phrase is considered — matches the current Marcus persona rule. fire_on_wake_match=true fires the action instantly on transcript; false defers until Gemini's turn_complete (robot speaks the acknowledgement first, then moves) — mirrors Sanad's fire_on_wake_match flag in voice/text_utils.maybe_trigger_arm.", "trigger_enabled": true, "require_wake_word": true, "fire_on_wake_match": true, "stream_buffer_sec": 2.0, "dedup_window_sec": 2.0, "repeat_suppress_sec": 0.25, "pending_action_ttl_sec": 6.0 }, "actions": { "turn_left": { "canonical": "turn left", "description": "Rotate in place 90° to the left.", "phrases": [ "turn left", "rotate left", "spin left", "go left", "face left" ] }, "turn_right": { "canonical": "turn right", "description": "Rotate in place 90° to the right.", "phrases": [ "turn right", "rotate right", "spin right", "go right", "face right" ] }, "turn_around": { "canonical": "turn around", "description": "Rotate 180°.", "phrases": [ "turn around", "turn back", "spin around", "about face", "face the other way" ] }, "move_forward": { "canonical": "move forward", "description": "Walk forward one step interval.", "phrases": [ "move forward", "go forward", "walk forward", "step forward", "forward", "keep going", "walk ahead" ] }, "move_back": { "canonical": "move backward", "description": "Walk backward one step interval.", "phrases": [ "move back", "move backward", "go back", "go backward", "walk back", "walk backward", "step back", "backward", "reverse" ] }, "step_left": { "canonical": "move left", "description": "Sidestep left.", "phrases": [ "step left", "move left", "slide left", "strafe left" ] }, "step_right": { "canonical": "move right", "description": "Sidestep right.", "phrases": [ "step right", "move right", "slide right", "strafe right" ] }, "stop": { "canonical": "stop", "description": "Halt current motion immediately.", "phrases": [ "stop", "halt", "wait", "pause", "freeze", "hold", "stop moving", "stand still", "don't move" ] }, "sit_down": { "canonical": "sit down", "description": "Sit down to the ground from standing.", "phrases": [ "sit down", "sit", "take a seat", "have a seat" ] }, "stand_up": { "canonical": "stand up", "description": "Stand up from sitting.", "phrases": [ "stand up", "stand", "get up", "rise" ] }, "wave_hello": { "canonical": "wave hello", "description": "Wave with the right arm.", "phrases": [ "wave hello", "wave", "say hi", "greet", "wave to me", "wave at me" ] }, "raise_arm": { "canonical": "raise arm", "description": "Raise the right arm straight up.", "phrases": [ "raise arm", "raise your arm", "lift your arm", "arm up", "hand up" ] }, "lower_arm": { "canonical": "lower arm", "description": "Return the arm to the resting position.", "phrases": [ "lower arm", "lower your arm", "drop your arm", "arm down", "hand down", "rest your arm" ] }, "point": { "canonical": "point", "description": "Point with the right arm (used after 'look at ...').", "phrases": [ "point", "point at it", "point to it", "point there" ] }, "come_here": { "canonical": "come here", "description": "Approach the speaker.", "phrases": [ "come here", "come to me", "come closer", "approach", "get closer", "come over here" ] }, "follow_me": { "canonical": "follow me", "description": "Follow the speaker until told to stop.", "phrases": [ "follow me", "come with me", "walk with me" ] }, "stay_here": { "canonical": "stay here", "description": "Stop following and hold position.", "phrases": [ "stay here", "stay", "wait here", "hold position", "don't follow me" ] }, "go_home": { "canonical": "go home", "description": "Return to the home position.", "phrases": [ "go home", "return home", "head home", "go back home" ] }, "patrol": { "canonical": "patrol", "description": "Start the patrol routine.", "phrases": [ "patrol", "start patrol", "begin patrol", "patrol the area", "walk the route" ] }, "look_around": { "canonical": "look around", "description": "Scan the environment (vision sweep).", "phrases": [ "look around", "scan the room", "scan around", "survey the area", "have a look around" ] } } }