{ "_comment": "N2 Phase 3 — phrase->canonical movement map for Gemini voice control. The dispatcher (voice/movement_dispatch.py) matches these against GEMINI'S OWN spoken (BOT) transcript (the Marcus phrase-confirmation pattern), NOT the user text. Gemini is instructed (system prompt) to speak ONE short canonical confirmation phrase per requested motion, in EN or AR. Bot_phrases are matched as case-insensitive substrings (English) / exact substrings (Arabic). Parametric regexes keep the number.", "command_cooldown_sec": 1.5, "max_steps": 8, "max_degrees": 360, "degrees_per_step": 15, "actions": { "move_forward": { "canonical": "move forward", "bot_phrases": { "english": ["moving forward", "walking forward", "stepping forward", "stepping closer", "coming closer", "moving ahead"], "arabic": ["أمشي للأمام", "أتحرك للأمام", "أتقدم للأمام", "أتقدم خطوة", "أتقدّم خطوة"] } }, "move_backward": { "canonical": "move backward", "bot_phrases": { "english": ["moving back", "moving backward", "walking back", "stepping back", "backing up"], "arabic": ["أمشي للخلف", "أتحرك للخلف", "أرجع للخلف", "أتراجع"] } }, "turn_right": { "canonical": "turn right", "bot_phrases": { "english": ["turning right", "rotating right", "spinning right"], "arabic": ["أستدير يميناً", "أستدير يمينا", "أستدير لليمين", "أدور يمين"] } }, "turn_left": { "canonical": "turn left", "bot_phrases": { "english": ["turning left", "rotating left", "spinning left"], "arabic": ["أستدير يساراً", "أستدير يسارا", "أستدير لليسار", "أدور يسار"] } }, "slide_left": { "canonical": "slide left", "bot_phrases": { "english": ["sliding left", "strafing left", "stepping left"], "arabic": ["أنزلق لليسار", "أتحرك جانباً لليسار"] } }, "slide_right": { "canonical": "slide right", "bot_phrases": { "english": ["sliding right", "strafing right", "stepping right"], "arabic": ["أنزلق لليمين", "أتحرك جانباً لليمين"] } }, "stop": { "canonical": "stop", "bot_phrases": { "english": ["stopping", "i'll stop", "i will stop", "halting", "holding still"], "arabic": ["أتوقف", "سأتوقف", "توقفت", "أتوقّف"] } } }, "parametric_actions": [ { "regex": "walking forward (\\d+) steps?", "canonical": "walk forward $1 steps" }, { "regex": "walking back(?:ward)? (\\d+) steps?", "canonical": "walk backward $1 steps" }, { "regex": "walking (\\d+) steps?", "canonical": "walk forward $1 steps" }, { "regex": "turning right (\\d+) deg(?:ree(?:s)?)?", "canonical": "turn right $1 degrees" }, { "regex": "turning left (\\d+) deg(?:ree(?:s)?)?", "canonical": "turn left $1 degrees" }, { "regex": "turning (\\d+) deg(?:ree(?:s)?)?", "canonical": "turn right $1 degrees" }, { "regex": "(?:أمشي للخلف|أتحرك للخلف|أرجع|أتراجع) (\\d+) خطوات", "canonical": "walk backward $1 steps" }, { "regex": "(?:أمشي|أتحرك|أتقدم)(?: للأمام| للامام)? (\\d+) خطوات", "canonical": "walk forward $1 steps" }, { "regex": "(?:أستدير|أدور) (?:يميناً|يمينا|يمين|لليمين) (\\d+) درجة", "canonical": "turn right $1 degrees" }, { "regex": "(?:أستدير|أدور) (?:يساراً|يسارا|يسار|لليسار) (\\d+) درجة", "canonical": "turn left $1 degrees" } ] }