{
  "release": "0.10.1-sticks3-qre1113-tiltreplay",
  "runtime_version": "0.10.1-sticks3-tiltreplay",
  "date": "2026-10-04",
  "board": "M5StickS3 K150",
  "sensor": "SparkFun QRE1113 analog breakout",
  "status": "first-install-flash-readback-verified-awaiting-runtime",
  "installed": true,
  "binary": "LaunchLabMini.ino.bin",
  "application_offset": "0x10000",
  "flash_hash_verified": true,
  "runtime_version_confirmed": false,
  "display": {
    "width": 135,
    "height": 240,
    "rotation": 0,
    "usb_c": "down"
  },
  "main_page": {
    "measurement_always_enabled": true,
    "pause_control": false,
    "auto_feedback_ms": 5000,
    "replay_ms": 1800,
    "A": "recall/toggle latest recap",
    "B": "history",
    "feedback": [
      "peak RPM",
      "fixed-center isometric orientation replay",
      "frozen Start/End tilt circles"
    ],
    "numeric_angle_text": false,
    "usb_marker": "white short edge of sensor-board rectangle",
    "view": "Fixed-center body in tighter \u00b10.84 isometric cube; blue screen, violet back, white USB cap, fixed gravity reference and progress marker; no reference ghost in automatic recap",
    "display_heading_offset_degrees": 45,
    "A_hold": "toggle tournament mode (1 second)"
  },
  "motion": {
    "algorithm": "Upstream VQF 6D with default parameters",
    "source_commit": "86ba56bdd3158b9b05f9f9fe5596866ba326438c",
    "source_license": "MIT",
    "filter_hz": 100,
    "processing": "continuous fusion before chart reduction; measured-time gyro integration onto fixed grid",
    "bias": "automatic rest and motion gyro bias estimation",
    "orientation": "Measured gravity-relative tilt; arbitrary heading reset at onset to camera horizontal axis (+X,+Y); fixed 45-degree display offset only. Comparisons remain onset-relative.",
    "position": "disabled",
    "velocity": "disabled",
    "height": "disabled",
    "travel_trail": false,
    "absolute_heading": "unavailable",
    "distance_units": false,
    "cube": "fixed scale \u00b10.84 display units; full body rotation bound contained",
    "capture_ms": {
      "pre": 500,
      "post": 250
    },
    "post_roll_gate": "fused-sample timestamp, not raw-poll timestamp",
    "stationary_required": false,
    "startup_or_gap_settle_ms": 1500,
    "gap_rejection_us": 35000,
    "reference_schema": 4,
    "older_references": "readable and retained; require a fresh fused reference for comparison",
    "reference_image_bytes": 1124,
    "latest_trace": "RAM unless selected as stored reference",
    "replay_window": "optical onset 0 ms to optical end durationMs; full pre/post capture retained"
  },
  "optical_profile": {
    "gpio": 1,
    "supply_v": 3.3,
    "minimum_mark_counts": 80,
    "edge_swing_fraction": 0.7,
    "samples_per_second": 50000,
    "pulses_per_revolution": 1,
    "minimum_rpm": 1000,
    "changed": true,
    "thresholds_changed": false,
    "peak_metric": "selected maximum of valid three-consecutive-turn elapsed-time averages (default), or individually validated one-turn peak",
    "confirmation_turns": 3,
    "peak_turns": 3,
    "maximum_measurement_rpm": 30000,
    "human_limit": "not asserted; existing detector timing ceiling retained",
    "arrival_mark_check_us": 500,
    "edge_timestamp_resolution_us": 100,
    "slowdown_metric": "sustained three-turn peak",
    "speed_jump_veto": false
  },
  "power": {
    "auto_off_ms": 180000,
    "battery_page": true,
    "changed": true,
    "sleep": "IMU-only PM1 power hold; ESP32 ext0 G13 fallback if USB retains power",
    "wake": "BMI270 any-motion on INT1 -> PM1 GPIO4",
    "threshold_mg": 983,
    "duration_ms": 120,
    "gyro_in_sleep": false,
    "sensor_supply": "3V3_L2 off on PM1 battery standby",
    "activity": "accepted launch, active launch burst, buttons and explicit USB actions; IMU movement/status polling do not extend selected timeout",
    "manual_power_off": "does not arm motion wake",
    "battery_life": "not measured",
    "threshold_counts": 2047,
    "threshold_limit": "11 bits; closest to doubling 1024 counts",
    "wake_feature_readback": true,
    "default_sleep_minutes": 3,
    "timeout_options_minutes": [
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10
    ],
    "timeout_persistent": true,
    "timeout_preference": "launchlab-mini/sleep_min",
    "settings_control": "Settings: hold B selects Sleep/RPM row; hold A changes/saves selected row; short A next page, short B main",
    "timeout_step_minutes": 1
  },
  "validation": {
    "compile": "passed",
    "power_tests": "3-minute default, all 1\u201310 options, boundary/activity/burst/rollover/invalid-value tests passed",
    "wake_state_tests": "both tournament views and all normal pages round-trip; corrupt, removed-view, conflicting and incompatible records rejected",
    "device_flash": "Fresh factory M5StickS3: full four-image native esptool USB installation and exact SHA-256 readback passed using the live Pages bundle. Browser chooser cancelled before writes; physical browser transfer pending.",
    "physical_wake_resume": "pending physical sleep/shake check",
    "saved_current_timeout": "not changed offline",
    "tournament_views": "unchanged two-view implementation",
    "native_tests": "motion-replay tests including new interpolated onset/end lookup, sanitizer pass; launch-motion regressions pass",
    "trace_replay": "14 captures: frozen three-turn result/count/burst timestamps and prior single peak values match",
    "runtime": "Awaiting physical power cycle; USB console silent after software reset.",
    "history": "Fresh device; new 20 KB NVS region unchanged by four-image writes before first boot. No prior LaunchLab history on this device.",
    "visual_review": "Actual MotionUI primitive renders: playback phases, 18 axis/extreme poses, missing/pending states; approximate host fonts, synthetic trace; device review pending"
  },
  "toolchain": {
    "arduino_esp32": "3.3.0",
    "m5unified": "0.2.23",
    "m5gfx": "0.2.30",
    "vqf_single_precision": true,
    "bmi270_api_source_commit": "21ea234de321da07c552f7a43cb36f7df4f73a27"
  },
  "previous_releases_preserved": [
    "0.10.0-sticks3-qre1113-estimators",
    "0.9.2-sticks3-qre1113-wakeresume",
    "0.9.1-sticks3-qre1113-settings",
    "0.9.0-sticks3-qre1113-settings",
    "0.8.2-sticks3-qre1113-shakewake",
    "0.8.1-sticks3-qre1113-shakewake",
    "0.8.0-sticks3-qre1113-shakewake",
    "0.7.2-sticks3-qre1113-tournamentviews",
    "0.7.1-sticks3-qre1113-tournament",
    "0.7.0-sticks3-qre1113-singlepeak",
    "0.6.2-sticks3-qre1113-rotation",
    "0.6.1-sticks3-qre1113-rotation",
    "0.6.0-sticks3-qre1113-rotation",
    "0.5.1-sticks3-qre1113-front",
    "0.2.0-sticks3-tcrt5000"
  ],
  "tournament_mode": {
    "display": [
      "recording_only",
      "rpm"
    ],
    "level_visible": false,
    "auto_recap_visible": false,
    "titles_status_hints_visible": false,
    "activation": "hold A on main page for 1 second",
    "exit": "hold A for 1 second",
    "other_short_buttons": "A ignored; B cycles view",
    "new_session_control": "hold A on a history page; reference selection unchanged on Motion/Recreate",
    "default_on_boot": false,
    "persistent": "one-shot mode/page snapshot at automatic sleep only; toggles remain RAM-only",
    "acquisition_history_motion_power": "unchanged",
    "entry_view": "recording_only",
    "B": "cycle recording_only -> rpm -> recording_only",
    "recording_only_style": "static red RECORDING ONLY card on black",
    "wake_resume": true
  },
  "binary_bytes": 731728,
  "sha256": "bf3b6607729de89fccae3ddb15b4724216abfe2ce56bba5e8918b287d629fc66",
  "wake_resume": {
    "storage": "launchlab-mini/wake_ui uint32 versioned record",
    "saved_when": "only before automatic sleep, after acquisition stopped and launch/reference data saved",
    "consumed_when": "startup, once, before restoring mode",
    "restores": [
      "normal/tournament",
      "selected tournament view",
      "normal history page/view"
    ],
    "temporary_recap": "returns to live; captured motion replay is not written by this change",
    "save_failure": "sleep deferred and measurement restored",
    "invalid_state": "normal safe default",
    "plain_restart": "normal mode when no pending sleep record"
  },
  "rpm_estimators": {
    "default": "three_turn_peak",
    "options": [
      "three_turn_peak",
      "single_turn_peak"
    ],
    "setting": "launchlab-mini/rpm_method versioned checksummed 4-byte blob",
    "three_turn_formula": "180000000/(period1_us+period2_us+period3_us)",
    "control_path": "frozen three-turn confirmation/slowdown/quiet/rearm for both choices",
    "paired_logging": "per accepted shot USB LAUNCH_METRICS; not persisted in existing history schema",
    "history": "original scalar RPM retained, estimator identity unknown for older records",
    "session_boundary": "on boot and setting change, next accepted pull",
    "absolute_calibration": false
  }
}
