{
  "_description": "Tunables for core/* modules. Loaded via core.config_loader.load('core').",

  "brain": {
    "allowed_callback_prefixes": [
      "Project.Sanad.motion.",
      "Project.Sanad.voice.",
      "motion.",
      "voice."
    ],
    "gestural_speaking_default": false
  },

  "logger": {
    "log_level": "INFO",
    "format": "%(asctime)s [%(name)s] %(levelname)-7s %(message)s",
    "datefmt": "%Y-%m-%d %H:%M:%S",
    "file_max_bytes": 10485760,
    "file_backup_count": 7
  },

  "event_bus": {
    "emit_timeout_sec": 0.5
  },

  "paths": {
    "_comment": "Path roots — resolved against BASE_DIR in core/config.py",
    "data": "data",
    "logs": "logs",
    "scripts": "scripts",
    "model": "model",
    "audio_recordings": "data/audio",
    "motion_recordings": "data/recordings/motion",
    "motions": "data/motions"
  },

  "gemini_defaults": {
    "_comment": "Baseline Gemini API config — SINGLE SOURCE OF TRUTH. All voice modules read from here.",
    "api_key": "",
    "model_live": "gemini-2.5-flash-native-audio-preview-12-2025",
    "model_ws_uri": "wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1alpha.GenerativeService.BidiGenerateContent",
    "voice_name": "Charon",
    "ws_timeout_sec": 30,
    "default_system_prompt": "You are Bousandah, a wise and friendly Emirati assistant. Speak strictly in the UAE dialect (Khaleeji). Be helpful, concise, and use local greetings like 'Marhaba' and 'Ya Khoy'."
  },

  "g1_hardware": {
    "_comment": "G1 humanoid hardware constants — shared by every motion/voice module that talks to the arm.",
    "num_motor": 29,
    "enable_arm_sdk_index": 29,
    "replay_hz": 60.0
  },

  "script_files": {
    "_comment": "Filenames (under scripts/) used across voice + dashboard",
    "persona": "sanad_script.txt",
    "rules": "sanad_rule.txt",
    "arm_phrases": "sanad_arm.txt"
  },

  "dashboard_defaults": {
    "host": null,
    "port": 8000,
    "interface": "wlan0"
  },

  "audio_defaults": {
    "_comment": "Host PulseAudio fallback only — the G1 deployment uses UDP multicast mic + AudioClient.PlayStream speaker (see SANAD_USE_G1_MIC in config.py LIVE_TUNE). Default here is the Jetson/G1 built-in platform-sound chip.",
    "send_sample_rate": 16000,
    "receive_sample_rate": 24000,
    "chunk_size": 512,
    "channels": 1,
    "sink": "alsa_output.platform-sound.analog-stereo",
    "source": "alsa_input.platform-sound.analog-stereo"
  },

  "dds": {
    "network_interface_default": "eth0"
  },

  "camera": {
    "_comment": "Recognition tab camera daemon (parent process reads this). width/height/fps/jpeg_quality + the reconnect knobs configure CameraDaemon. Frames are cached in memory and pushed to the Gemini child over its stdin (no file drop). send_hz/stale_ms are read by the Gemini child via SANAD_VISION_SEND_HZ / SANAD_VISION_STALE_MS env vars (LIVE_TUNE).",
    "width": 424,
    "height": 240,
    "fps": 15,
    "jpeg_quality": 70,
    "send_hz": 2,
    "stale_ms": 1500,
    "stale_threshold_s": 10.0,
    "reconnect_min_s": 2.0,
    "reconnect_max_s": 10.0,
    "capture_timeout_ms": 5000
  },

  "faces": {
    "_comment": "Face gallery for Gemini-side recognition. Folder layout: data/faces/face_{id}/{face_1.jpg, ...} + optional meta.json {\"name\": \"...\"}. Gemini does the matching — no local ML model.",
    "dir_rel": "data/faces",
    "max_samples_per_face": 3,
    "primer_resize_long_side": 256
  }
}
