Files

292 lines
7.9 KiB
YAML

# Zacus Scenario — Canonical YAML (v3)
# Generated: 2026-02-25
#
# Conventions:
# - step_id = STEP_*, screen_scene_id = SCENE_*
# - led_policy is a sibling of transitions (NOT nested inside)
# - QR rule scene_id aligned to SCENE_QR_DETECTOR
# - Final transitions go to SCENE_MEDIA_MANAGER (hub scene)
#
# Narrative anchors (conversation):
# - Prototype: U-SON
# - Acte 1 (~45min): LA 440 Hz (STEP_LA_DETECTOR)
# - Acte 2 (~60min): Zone 4 piano-alphabet → jouer "LEFOU" (STEP_LEFOU_DETECTOR)
# * Lettres collées en ordre aléatoire sur touches blanches
# * A placé sur la touche correspondant au LA 440 Hz (ancre)
# - QR final: payload "WIN", caché derrière le portrait dans la Salle des Archives
prompt_input:
meta:
request_name: "DEFAULT_UNLOCK_WIN_ETAPE2"
owner: "clement"
board_target: "freenove_esp32s3"
objective: "U-SON: Acte1 LA440 (~45min) -> Acte2 piano 'LEFOU' (~60min) -> QR WIN -> Media Manager (persistant)"
boot_policy:
startup_mode: "story" # story | media_manager
persist_after_validation: true
rollback_command_required: true
qr_rule:
enabled: true
scene_id: "SCENE_QR_DETECTOR"
expected_payload: "WIN"
match_mode: "exact" # exact | prefix | contains
case_insensitive: true
success_event: "UNLOCK_QR"
failure_event: "QR_INVALID"
media_hub:
enabled: true
hub_scene_id: "SCENE_MEDIA_MANAGER"
entries:
- "SCENE_PHOTO_MANAGER"
- "SCENE_MP3_PLAYER"
- "SCENE_READY"
led_policy:
strict_rgb: true
defaults:
ws2812: 1
led_auto: 1
rgb: "18/45/95"
scene_overrides:
- scene_id: "SCENE_LA_DETECTOR"
rgb: "dynamic_tuner_or_off"
custom_steps: []
serial_test_plan:
- "SC_LOAD DEFAULT"
- "SCENE_GOTO SCENE_U_SON_PROTO"
- "QR_SIM WIN"
- "SC_EVENT UNLOCK_QR"
- "BOOT_MODE_STATUS"
- "RESET"
acceptance_criteria:
- "Pas de PANIC|ASSERT|ABORT|REBOOT|rst:"
- "Transitions scene avec ACK ... ok=1"
- "Ownership camera/mic/amp coherent"
- "LED WS2812 conformes policy + RGB"
- "Boot mode media_manager persistant apres QR valide"
notes:
- "Prototype: U-SON."
- "Etape1: LA 440 Hz stable (Acte1 ~45min)."
- "Etape2: piano-alphabet → jouer 'LEFOU' (Acte2 ~60min)."
- "QR WIN: caché derrière le portrait (Salle des Archives)."
- "SCENE_QR_DETECTOR a un timeout (QR_TIMEOUT) pour eviter le blocage."
scenario:
id: "DEFAULT"
version: 2
initial_step: "STEP_U_SON_PROTO"
app_bindings:
- "APP_AUDIO"
- "APP_SCREEN"
- "APP_GATE"
- "APP_WIFI"
- "APP_ESPNOW"
- "APP_SONAR"
- "APP_SD"
- "APP_CAMERA"
- "APP_LED"
- "APP_SERIAL"
- "APP_TIMER"
- "APP_UNLOCK"
- "APP_QR"
- "APP_INPUT"
- "APP_LOG"
- "APP_ACTION"
steps_runtime_order:
- step_id: "STEP_U_SON_PROTO"
screen_scene_id: "SCENE_U_SON_PROTO"
audio_pack_id: "PACK_BOOT_RADIO"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "audio_done:loop->STEP_U_SON_PROTO"
- "BTN:ANY->STEP_LA_DETECTOR"
- "serial:FORCE_ETAPE2->STEP_LA_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "random_one_blink"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_LA_DETECTOR"
screen_scene_id: "SCENE_LA_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QUEUE_SONAR"
transitions:
- "timer:ETAPE2_DUE->STEP_U_SON_PROTO"
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE1"
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE1"
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE1"
- "serial:FORCE_WIN_ETAPE1->STEP_RTC_ESP_ETAPE1"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "dynamic_tuner"
brightness: "100%"
rgb: "random_color"
- step_id: "STEP_RTC_ESP_ETAPE1"
screen_scene_id: "SCENE_WIN_ETAPE1"
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE1"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
- "ACTION_ESP_NOW_SEND_ETAPE1"
- "ACTION_QUEUE_SONAR"
transitions:
- "esp_now:ACK_WIN1->STEP_WIN_ETAPE1"
- "serial:FORCE_DONE->STEP_WIN_ETAPE1"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "breathing"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_WIN_ETAPE1"
screen_scene_id: "SCENE_WIN_ETAPE1"
audio_pack_id: "PACK_WIN"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "serial:BTN_NEXT->STEP_WARNING"
- "serial:FORCE_DONE->STEP_WARNING"
- "esp_now:ACK_WARNING->STEP_WARNING"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "K2000"
brightness: "K2000"
rgb: "red"
- step_id: "STEP_WARNING"
screen_scene_id: "SCENE_WARNING"
audio_pack_id: "PACK_BOOT_RADIO"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
transitions:
- "audio_done:loop->STEP_WARNING"
- "BTN:ANY->STEP_LEFOU_DETECTOR"
- "serial:FORCE_ETAPE2->STEP_LEFOU_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "blink_all"
brightness: "100%"
rgb: "red"
- step_id: "STEP_LEFOU_DETECTOR"
screen_scene_id: "SCENE_LEFOU_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QUEUE_SONAR"
transitions:
- "timer:ETAPE2_DUE->STEP_WARNING"
- "serial:BTN_NEXT->STEP_RTC_ESP_ETAPE2"
- "unlock:UNLOCK->STEP_RTC_ESP_ETAPE2"
- "action:ACTION_FORCE_ETAPE2->STEP_RTC_ESP_ETAPE2"
- "serial:FORCE_WIN_ETAPE2->STEP_RTC_ESP_ETAPE2"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "dynamic_tuner"
brightness: "100%"
rgb: "random_color"
- step_id: "STEP_RTC_ESP_ETAPE2"
screen_scene_id: "SCENE_WIN_ETAPE2"
audio_pack_id: "PACK_CONFIRM_WIN_ETAPE2"
actions:
- "ACTION_TRACE_STEP"
- "ACTION_HW_LED_ALERT"
- "ACTION_ESP_NOW_SEND_ETAPE2"
- "ACTION_QUEUE_SONAR"
transitions:
- "esp_now:ACK_WIN2->STEP_QR_DETECTOR"
- "serial:FORCE_DONE->STEP_QR_DETECTOR"
led_policy:
ws2812_1: on
ws2812_2: off
ws2812_3: off
ws2812_4: on
animation: "breathing"
brightness: "random_bright"
rgb: "random_color"
- step_id: "STEP_QR_DETECTOR"
screen_scene_id: "SCENE_QR_DETECTOR"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_QR_CODE_SCANNER_START"
- "ACTION_QR_TIMEOUT_30S"
transitions:
- "timer:ETAPE2_DUE->STEP_RTC_ESP_ETAPE2"
- "event:QR_TIMEOUT->STEP_RTC_ESP_ETAPE2"
- "serial:BTN_NEXT->STEP_FINAL_WIN"
- "unlock:UNLOCK_QR->STEP_FINAL_WIN"
- "action:ACTION_FORCE_ETAPE2->STEP_FINAL_WIN"
- "serial:FORCE_WIN_ETAPE2->STEP_FINAL_WIN"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "bargraph_qr_trigger"
brightness: "bargraph"
rgb: "bargraph_red_to_green"
- step_id: "STEP_FINAL_WIN"
screen_scene_id: "SCENE_FINAL_WIN"
audio_pack_id: ""
actions:
- "ACTION_TRACE_STEP"
- "ACTION_WINNER"
transitions:
- "timer:WIN_DUE->SCENE_MEDIA_MANAGER"
- "serial:BTN_NEXT->SCENE_MEDIA_MANAGER"
- "unlock:UNLOCK->SCENE_MEDIA_MANAGER"
- "action:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
- "serial:FORCE_WIN_ETAPE2->SCENE_MEDIA_MANAGER"
led_policy:
ws2812_1: on
ws2812_2: on
ws2812_3: on
ws2812_4: on
animation: "blink_all_random"
brightness: "100%"
rgb: "random_color"
current_firmware_snapshot:
source_to_update_files:
- "docs/protocols/story_specs/scenarios/default_unlock_win_etape2.yaml"
- "data/story/scenarios/DEFAULT.json"