{
  "product": {
    "schema_version": "0.2",
    "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": "以下数值均为试调起点，非已测结论",
    "engine_selection": "Godot为当前验证宿主，最终生产选型未完成同题对比"
  },
  "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",
      "body": "撑脚稳住→髋肩带臂→腕部击鼓→反弹收势",
      "pre_contact": "pose preparation has no audio, damage or score; bounded IK only at release",
      "hit": "drum_contact emits wave; target collision causes HP loss",
      "music": "actual_drum_contact_triggers_percussion; authored_main_beat_offset_calibrated",
      "movement": "保持路线推进",
      "anticipation_lead_ms_candidate": 240,
      "input_to_contact_target_ms": 80,
      "release_target_status": "测试目标，非爱音塔实测",
      "contact_policy": "anticipate before cue; input triggers release immediately; no wait to next beat",
      "grade_policy": "grade once at input; log real contact delta separately; no second rhythm penalty"
    },
    "heavy": {
      "input": "K / east_face / touch_heavy",
      "body": "沉髋蓄势→转腰带肩→短槌重落→全身回弹",
      "pre_contact": "pose preparation has no audio, damage or score; bounded IK only at release",
      "hit": "larger impulse and break threshold; not giant weapon",
      "music": "actual_drum_contact_triggers_percussion; authored_main_beat_offset_calibrated",
      "movement": "预定重击平台，避免同时精确跳跃",
      "anticipation_lead_ms_candidate": 320,
      "input_to_contact_target_ms": 100,
      "release_target_status": "测试目标，非爱音塔实测",
      "contact_policy": "anticipate before cue; input triggers release immediately; no wait to next beat",
      "grade_policy": "grade once at input; log real contact delta separately; no second rhythm penalty"
    },
    "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": "实际接触时记录；不预先把落槌锁到未来半拍；以完整动作相位和误差分布评审",
      "slow_tempo_fast_tempo": "re-author_offsets_or_change_action; never arbitrary whole-body speed scaling",
      "response_target_scope": "输入到首次可见动作；不是触鼓延迟承诺",
      "turning_policy": "转身／不可达状态单独统计；不可瞬移鼓或扭曲骨架掩盖长延迟；路线提前给目标方向",
      "root_authority": "角色根运动仅由一个控制器消费；动画与物理不得重复叠加位移"
    }
  },
  "route_graph": {
    "status": "typed_numeric_fixture_not_built_level",
    "route_id": "L01_P08",
    "units": "meters_and_quarter_beats",
    "entry": {
      "beat": 32,
      "position": [
        0,
        0
      ]
    },
    "exit": {
      "beat": 40,
      "position": [
        14,
        6.5
      ]
    },
    "routes": [
      {
        "id": "safe",
        "nodes": [
          {
            "beat": 32,
            "position": [
              0,
              0
            ]
          },
          {
            "beat": 34,
            "position": [
              4,
              1
            ]
          },
          {
            "beat": 36,
            "position": [
              8,
              2.5
            ]
          },
          {
            "beat": 38,
            "position": [
              11,
              4.5
            ]
          },
          {
            "beat": 40,
            "position": [
              14,
              6.5
            ]
          }
        ],
        "required_cues": [
          32,
          34,
          36,
          38
        ],
        "score_weight_total": 4,
        "reward": "standard",
        "edges": [
          {
            "from_beat": 32,
            "to_beat": 34,
            "type": "supported_run"
          },
          {
            "from_beat": 34,
            "to_beat": 36,
            "type": "ballistic_jump"
          },
          {
            "from_beat": 36,
            "to_beat": 38,
            "type": "supported_run"
          },
          {
            "from_beat": 38,
            "to_beat": 40,
            "type": "supported_run"
          }
        ],
        "landing_width_m": 1.8
      },
      {
        "id": "flair",
        "nodes": [
          {
            "beat": 32,
            "position": [
              0,
              0
            ]
          },
          {
            "beat": 34,
            "position": [
              4,
              1
            ]
          },
          {
            "beat": 36,
            "position": [
              9,
              3.5
            ]
          },
          {
            "beat": 38,
            "position": [
              12,
              5.5
            ]
          },
          {
            "beat": 40,
            "position": [
              14,
              6.5
            ]
          }
        ],
        "required_cues": [
          32,
          34,
          36,
          38
        ],
        "score_weight_total": 4,
        "reward": "style_badge_only",
        "edges": [
          {
            "from_beat": 32,
            "to_beat": 34,
            "type": "supported_run"
          },
          {
            "from_beat": 34,
            "to_beat": 36,
            "type": "ballistic_jump"
          },
          {
            "from_beat": 36,
            "to_beat": 38,
            "type": "supported_run"
          },
          {
            "from_beat": 38,
            "to_beat": 40,
            "type": "supported_run"
          }
        ],
        "landing_width_m": 0.9
      }
    ],
    "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",
      "edge_type_explicit",
      "root_position_in_meters",
      "run_segment_requires_authored_support_surface",
      "bounded_jump_assist_solves_velocity_not_teleport"
    ],
    "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_input_cues_contact_times_observed_at_runtime",
    "bpm": 120,
    "offset_seconds": 0,
    "events": [
      {
        "id": "e01",
        "beat": 32,
        "action": "light",
        "instrument": "paigu_high",
        "target": "sentinel_a",
        "weight": 1,
        "contact_timing": "runtime_measured_after_immediate_release"
      },
      {
        "id": "e02",
        "beat": 34,
        "action": "jump",
        "instrument": "woodblock",
        "target": null,
        "weight": 1
      },
      {
        "id": "e03",
        "beat": 36,
        "action": "light",
        "instrument": "paigu_mid",
        "target": "sentinel_b",
        "weight": 1,
        "contact_timing": "runtime_measured_after_immediate_release"
      },
      {
        "id": "e04",
        "beat": 38,
        "action": "heavy",
        "instrument": "big_drum",
        "target": "resonance_gate",
        "weight": 1,
        "contact_timing": "runtime_measured_after_immediate_release"
      }
    ],
    "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不得因前段可恢复失误形成无法结束的软锁",
    "working_target_scope": "仅音乐时长工作目标，前后流程另计"
  },
  "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": "无需复制核心代码；验证可编辑性而非一次性演示"
    },
    "G7": {
      "name": "four_real_game_states",
      "status": "not_produced",
      "required": [
        "normal_play",
        "hero_super",
        "liva_transformation_or_summon",
        "boss_super"
      ],
      "method": "同版同场景原速捕获；概念图或四种墨强度不能替代"
    }
  },
  "physics_contract": {
    "status": "candidate_numerical_fixture_only",
    "coordinates": {
      "x": "前进／米",
      "y": "竖直向上／米",
      "gravity_direction": "-y"
    },
    "units": "m,s,kg; score timing in ms",
    "gravity_m_s2": 18,
    "gravity_note": "风格化候选重力，非地球重力或真人能力宣称",
    "physics_tick_hz_candidate": 60,
    "render_fps_cases": [
      30,
      60,
      120
    ],
    "max_horizontal_air_speed_m_s": 6.8,
    "max_launch_vertical_speed_m_s": 13,
    "max_supported_speed_m_s": 5,
    "max_supported_slope_deg": 40,
    "max_downward_landing_speed_m_s": 10,
    "jump_input_jitter_ms_cases": [
      -130,
      -85,
      0,
      85,
      130
    ],
    "jump_solver": "T = landing_music_time - input_music_time; vx=dx/T; vy=dy/T+g*T/2; y(t)=vy*t-g*t*t/2",
    "solver_use": "有界起跳辅助；越限时不伪造可达，应改谱／中间落点／动作能力或显示失败",
    "old_flair_first_segment": "旧图若解释为1秒内普通跳高5米，需要vy14m/s，高于此候选上限；旧图无边类型，不可宣称已验证可达",
    "collision": "test swept path and body volume in authored level later; numerical endpoints alone are insufficient",
    "projection": "screen_position = camera_transform(world_position); collision never uses screen_pixels",
    "hitstop": "freeze selected presentation, not music/physics/score; continuous sample restores current time",
    "jolt": "general physics candidate; no claim it solves authored combat animation"
  },
  "asset_contract": {
    "status": "required_before_runtime_acceptance",
    "fields": [
      "asset_id",
      "source_path",
      "export_path",
      "creator_or_provider",
      "license_scope",
      "units_and_axes",
      "skeleton_id",
      "root_motion_policy",
      "materials_and_alpha_mode",
      "animation_markers",
      "version_hash",
      "consumer_build_id",
      "review_scope"
    ],
    "character_rules": [
      "one_coherent_body",
      "no_independent_limb_scale_to_fit_contact",
      "consistent_rest_pose_and_bone_lengths",
      "contact_ik_bounded",
      "cloth_does_not_hide_core_pose"
    ],
    "vfx_layers": [
      "authored_primary_shape",
      "spatial_deformation",
      "wet_dry_edges",
      "secondary_fragments",
      "separate_emissive_color"
    ],
    "source_trace": "复用素材和代码逐项标注来源，不把别人已有结果列成本轮原创"
  },
  "ai_workflow": {
    "status": "candidate_no_provider_call_this_turn",
    "production": [
      "research_with_primary_sources",
      "generate_editable_candidates",
      "validate_schema_and_asset_contract",
      "review_same_scene",
      "integrate_pinned_version",
      "observe_continuous_play"
    ],
    "runtime_liva": {
      "inputs": [
        "phrase_id",
        "rhythm_grade_history",
        "player_health_band",
        "route_choice",
        "relationship_state"
      ],
      "policy": "deterministic authored response library with variation; choose at phrase boundary",
      "outputs": [
        "response_phrase_id",
        "gesture_id",
        "optional_authored_cloud_event"
      ],
      "constraints": [
        "do_not_spawn_required_route_randomly",
        "do_not_modify_score_clock",
        "same_rank_rules"
      ],
      "cloud_llm": "not_on_frame_critical_or_scoring_path"
    },
    "research_only": [
      "ProtoMotions／Kimodo生成动作到物理追踪，尚未运行、下载或验证武术质量"
    ],
    "forbidden_claims": [
      "provider_success_means_good_art",
      "model_review_means_human_acceptance",
      "open_source_means_asset_license_unrestricted"
    ]
  }
}