{
  "product": {
    "schema_version": "0.1",
    "status": "P3_candidate_not_approved",
    "title": "爱音塔",
    "relationship": "麦洛谛的独立玩法版本，不替换原版",
    "view": "2.5D斜侧固定镜头，沿预制路线持续向上",
    "primary_proof": "一首完整曲子的可玩第一层",
    "platform": "PC制作验证优先；手机横屏输入同步设计；商业首发待确认",
    "level_count_vision": 101,
    "release_level_count": null,
    "music_track": null,
    "music_rights": "pending",
    "numeric_values": "以下数值均为试调起点，非已测结论"
  },
  "music_clock": {
    "status": "candidate",
    "source": "audio_playback",
    "display_seconds": "max(previous, playback_position + time_since_last_mix - output_latency)",
    "units": {
      "time": "seconds",
      "tempo": "beats_per_minute",
      "beat": "quarter_note"
    },
    "tempo_map_example_only": [
      {
        "start_beat": 0,
        "bpm": 120,
        "meter": [
          4,
          4
        ]
      }
    ],
    "track_offset_seconds": 0,
    "calibration": {
      "audio_ms": 0,
      "visual_ms": 0,
      "input_ms": 0,
      "sample_count": 20,
      "estimate": "median_valid_taps; report spread; user may adjust"
    },
    "discontinuities": [
      "pause",
      "resume",
      "seek",
      "device_change"
    ],
    "on_discontinuity": "new_epoch; clear_pending_events; count_in_before_resume",
    "hitstop": "presentation_only_audio_and_judgement_continue"
  },
  "judgement": {
    "status": "candidate_requires_playtest",
    "input_anchor": "cue_beat",
    "delta_ms": "1000 * (audio_clock_at_input_seconds - cue_audio_seconds) - input_calibration_ms",
    "calibration_sign": "positive_input_calibration_means_device_or_player_taps_late; subtract_once; audio_output_latency_already_in_clock",
    "offbeat_combat": "free action may deal 0.4x damage on real collision; does not consume cue or add combo",
    "result_single_source": "judgement_result_id",
    "windows_ms": {
      "perfect": 40,
      "good": 85,
      "accepted": 130
    },
    "priority": [
      "match_action",
      "closest_unconsumed_cue",
      "timing_grade"
    ],
    "one_input_consumes_max_cues": 1,
    "one_cue_consumes_max_inputs": 1,
    "wrong_action": "record_wrong_without_consuming_expected_cue; debounce_same_button_80ms; no_free_score",
    "miss_after_ms": 130,
    "required_cue_min_gap_beats": 1,
    "non_scoring_moves": "movement allowed; no combo, no scored instrument stem",
    "score_weights": {
      "perfect": 1,
      "good": 0.7,
      "accepted": 0.3,
      "miss": 0
    },
    "max_score": 1000000,
    "score_normalization": "sum(grade_weight * cue_weight) / sum(all_required_cue_weights) * max_score",
    "rank_groups": [
      "standard_unassisted",
      "assisted",
      "practice"
    ],
    "route_score_budget": "equal_per_phrase_for_ranked_routes",
    "sync_percent": "perfect_or_good_count / required_cue_count"
  },
  "actions": {
    "light": {
      "input": "J / south_face / touch_light",
      "cue_to_contact_beats": 0.5,
      "body": "撑脚稳住→髋肩带臂→腕部击鼓→反弹收势",
      "strike_segment_ms": 90,
      "pre_contact": "variable_preparation_or_hold; never stretch the 90ms strike segment",
      "hit": "drum_contact emits wave; target collision causes HP loss",
      "music": "selected short percussion event",
      "movement": "保持路线推进"
    },
    "heavy": {
      "input": "K / east_face / touch_heavy",
      "cue_to_contact_beats": 1,
      "body": "沉髋蓄势→转腰带肩→短槌重落→全身回弹",
      "strike_segment_ms": 120,
      "pre_contact": "authored preparation and variable hold",
      "hit": "larger impulse and break threshold; not giant weapon",
      "music": "low drum accent",
      "movement": "预定重击平台，避免同时精确跳跃"
    },
    "jump": {
      "input": "W_or_Space / north_face / touch_jump",
      "cue_to_contact_beats": 0,
      "body": "压身蹬地→空中收腿→脚先触地→屈膝吸收",
      "music": "takeoff_percussion; landing_secondary_if_authored",
      "coyote_ms": 90,
      "jump_buffer_ms": 100,
      "max_air_actions": 1
    },
    "dash": {
      "input": "L_or_Shift / west_face / touch_dash",
      "cue_to_contact_beats": 0,
      "body": "低重心穿身或侧翻，出口可接跑",
      "music": "short_transient",
      "invulnerability_ms": 100,
      "rule": "only authored hazard windows; no permanent spam invulnerability"
    },
    "liva": {
      "input": "auto_response_to_successful_phrase",
      "rule": "phrase_success unlocks one authored reachable cloud foothold; no random required platform",
      "manual_call": "later_candidate_not_first_level"
    },
    "global": {
      "response_target_ms": 50,
      "response_target_status": "target_to_measure_on_hardware_not_claim",
      "damage_only_on_wave_collision": true,
      "visual_grade_locked_at_input": true,
      "collision_failure": "keep rhythm grade; mark combat miss, no HP loss; diagnose reachability",
      "contact_time": "music_clock(cue_beat + action_contact_offset)",
      "slow_tempo_fast_tempo": "re-author_offsets_or_change_action; never arbitrary whole-body speed scaling"
    }
  },
  "route_graph": {
    "status": "illustrative_8_beat_phrase",
    "route_id": "L01_P08",
    "units": "meters_and_quarter_beats",
    "entry": {
      "beat": 32,
      "position": [
        0,
        0
      ]
    },
    "exit": {
      "beat": 40,
      "position": [
        14,
        8
      ]
    },
    "routes": [
      {
        "id": "safe",
        "nodes": [
          {
            "beat": 32,
            "position": [
              0,
              0
            ]
          },
          {
            "beat": 34,
            "position": [
              4,
              2
            ]
          },
          {
            "beat": 36,
            "position": [
              8,
              3
            ]
          },
          {
            "beat": 38,
            "position": [
              11,
              6
            ]
          },
          {
            "beat": 40,
            "position": [
              14,
              8
            ]
          }
        ],
        "required_cues": [
          32,
          34,
          36,
          38
        ],
        "score_weight_total": 4,
        "reward": "standard"
      },
      {
        "id": "flair",
        "nodes": [
          {
            "beat": 32,
            "position": [
              0,
              0
            ]
          },
          {
            "beat": 34,
            "position": [
              2,
              5
            ]
          },
          {
            "beat": 36,
            "position": [
              7,
              8
            ]
          },
          {
            "beat": 38,
            "position": [
              11,
              9
            ]
          },
          {
            "beat": 40,
            "position": [
              14,
              8
            ]
          }
        ],
        "required_cues": [
          32,
          34,
          36,
          38
        ],
        "score_weight_total": 4,
        "reward": "style_badge_only"
      }
    ],
    "choice_window_beats": [
      30,
      31.5
    ],
    "lock_at_beat": 31.5,
    "constraints": [
      "same_entry_exit_beat",
      "same_rank_score_budget",
      "every_jump_reachable_with_margin",
      "camera_reveals_next_required_landing",
      "no_random_platform_spawn"
    ],
    "recovery": {
      "max_assists_standard": 0,
      "assisted_mode_tokens": 2,
      "drop_hp_cost": 20,
      "method": "fade_and_move_to_next_authored_safe_node_with_two_beat_warning",
      "music": "continues",
      "suppress_cues_until_reentry": true,
      "suppressed_cues_score": "miss",
      "if_no_future_safe_node": "fail_at_next_safe_music_boundary",
      "after_tokens_used": "fail_at_next_safe_music_boundary"
    }
  },
  "chart_example": {
    "status": "synthetic_not_the_candidate_song",
    "bpm": 120,
    "offset_seconds": 0,
    "events": [
      {
        "id": "e01",
        "beat": 32,
        "action": "light",
        "contact_beat": 32.5,
        "instrument": "paigu_high",
        "target": "sentinel_a",
        "weight": 1
      },
      {
        "id": "e02",
        "beat": 34,
        "action": "jump",
        "contact_beat": 34,
        "instrument": "woodblock",
        "target": null,
        "weight": 1
      },
      {
        "id": "e03",
        "beat": 36,
        "action": "light",
        "contact_beat": 36.5,
        "instrument": "paigu_mid",
        "target": "sentinel_b",
        "weight": 1
      },
      {
        "id": "e04",
        "beat": 38,
        "action": "heavy",
        "contact_beat": 39,
        "instrument": "big_drum",
        "target": "resonance_gate",
        "weight": 1
      }
    ],
    "optional_motion": [
      {
        "beat": 35,
        "action": "dash",
        "scoring": false,
        "reason": "showcase_only_no_mandatory_hint"
      }
    ]
  },
  "vfx_profiles": {
    "status": "candidate_authored_assets_required",
    "all": {
      "protect_hud": true,
      "emission_by": "combat_result_id",
      "music_never_paused": true,
      "reduced_flash_available": true
    },
    "light": {
      "ink": "one readable broken brush arc",
      "palette": [
        "#122d31",
        "#d54a36"
      ],
      "screen_area_target_max": 0.08,
      "presentation_freeze_ms": 18
    },
    "heavy": {
      "ink": "fold→tear→flying-white→fragments",
      "palette": [
        "#10282b",
        "#e54a36",
        "#f0db9c"
      ],
      "screen_area_target_max": 0.22,
      "presentation_freeze_ms": 42
    },
    "break": {
      "ink": "directional burst linked to actual broken guard",
      "calligraphy": "one_result_one_glyph",
      "screen_area_target_max": 0.28,
      "presentation_freeze_ms": 55
    },
    "ensemble": {
      "ink": "scene-wide flowing stroke behind protected cues",
      "screen_area_target_max": 0.4,
      "presentation_freeze_ms": 65,
      "limit": "only authored musical climax; no full-screen white flash"
    }
  },
  "level_01": {
    "status": "candidate_music_first",
    "name": "鼓坊朝云",
    "residents": "鼓匠、运输伙计、守桥人、学徒",
    "conflict": "共鸣失衡令升降鼓台失序；守桥者试验新来者能否接奏",
    "track_file": null,
    "duration_seconds": null,
    "working_target_seconds": 300,
    "phases_normalized": [
      {
        "start": 0,
        "end": 0.1,
        "name": "入塔·听见人间"
      },
      {
        "start": 0.1,
        "end": 0.28,
        "name": "起行·两檐之间"
      },
      {
        "start": 0.28,
        "end": 0.45,
        "name": "接奏·伙伴与支路"
      },
      {
        "start": 0.45,
        "end": 0.64,
        "name": "独奏·追攀鼓楼"
      },
      {
        "start": 0.64,
        "end": 0.87,
        "name": "合奏·守桥对答"
      },
      {
        "start": 0.87,
        "end": 1,
        "name": "终章·回望与升门"
      }
    ],
    "first_build": "one_full_song_plus_start_settings_failure_retry_result",
    "boss_hp_example": 300,
    "player_hp_example": 100,
    "damage_example": {
      "light": 10,
      "heavy": 25,
      "hazard": 15,
      "fall": 20
    },
    "damage_multiplier": {
      "perfect": 1.25,
      "good": 1,
      "accepted": 0.7,
      "offbeat": 0.4
    },
    "warning": "数值仅用于联调；门和Boss不得因前段可恢复失误形成无法结束的软锁"
  },
  "quality_gates": {
    "status": "proposed_tests_not_results",
    "G1": {
      "name": "readable_rhythm",
      "method": "5名初次玩家，无口头提示，第一分钟辨认轻重跳闪与下一拍",
      "pass_target": "至少4人正确解释并完成基础句；记录样本小不能证明留存"
    },
    "G2": {
      "name": "music_movement_contract",
      "method": "合拍、早晚、错招、漏拍、两条路线、掉落、暂停和恢复",
      "pass_target": "每条路线完整通曲；无重复计分；音画事件可追溯"
    },
    "G3": {
      "name": "body_and_ink",
      "method": "原速和慢放同看；检查支撑脚、鼓触、波碰撞、受击与墨",
      "pass_target": "轻重可分、无滑步穿鼓、下一拍始终可读"
    },
    "G4": {
      "name": "whole_song",
      "method": "真实玩家从开始到结果页不剪辑游玩，失败重试一次",
      "pass_target": "完整曲目、首尾与结算齐全；不能用短样段代替"
    },
    "G5": {
      "name": "performance",
      "method": "指定实机录制与不录制各完整跑一次，记录frame_time和audio_drift",
      "pass_target": "目标60fps；P95≤20ms、P99≤33ms；大尖峰单列；音画漂移目标≤20ms，需测量"
    },
    "G6": {
      "name": "reuse_proof",
      "method": "用同工具配置第二段不同节奏、不同路线",
      "pass_target": "无需复制核心代码；验证可编辑性而非一次性演示"
    }
  }
}