# P19-03 到達表 7名×3ルートの到達表があり、未制作内容は欠損として残る。 原本§6の名前とatomic entity.keyを監査IDに使用。実装IDを捏造しない。カタログにはheroine_anriのみ。OriginalRelationshipStateはsubject_idを保持し7名の列挙はしない。 共通原本ルールと人物固有欠損を分離する。implementedは狭い保持処理だけで、自然ルート完成ではない。 |人物ID|原名|ルート|現在の到達性| |---|---|---|---| |anri|アンリ|純愛|欠損・通常到達未証明| |anri|アンリ|NTR|欠損・通常到達未証明| |anri|アンリ|堕落|欠損・通常到達未証明| |fine|フィーネ|純愛|欠損・通常到達未証明| |fine|フィーネ|NTR|欠損・通常到達未証明| |fine|フィーネ|堕落|欠損・通常到達未証明| |tomari|トマリ|純愛|欠損・通常到達未証明| |tomari|トマリ|NTR|欠損・通常到達未証明| |tomari|トマリ|堕落|欠損・通常到達未証明| |amelia|アメリア|純愛|欠損・通常到達未証明| |amelia|アメリア|NTR|欠損・通常到達未証明| |amelia|アメリア|堕落|欠損・通常到達未証明| |liz|リズ|純愛|欠損・通常到達未証明| |liz|リズ|NTR|欠損・通常到達未証明| |liz|リズ|堕落|欠損・通常到達未証明| |mimi|ミミ|純愛|欠損・通常到達未証明| |mimi|ミミ|NTR|欠損・通常到達未証明| |mimi|ミミ|堕落|欠損・通常到達未証明| |satsuki|サツキ|純愛|欠損・通常到達未証明| |satsuki|サツキ|NTR|欠損・通常到達未証明| |satsuki|サツキ|堕落|欠損・通常到達未証明| ## 共通原本ルール ### state_fields implemented / owner: P18-01 原本3値と盾の明示値の検証・保持のみ。初期値と更新方針は未定。 原本 docs/traceability/original/BASELINE.txt:138–143 ```text 3つの感情パラメータと防御値「愛の盾」、直接対決「決闘」によってヒロインの運命(純愛・NTR・堕落)をシミュレートする。 ## 7.2 感情パラメータと「愛の盾」 * **好感度 (Affection):** 主人公への愛。「愛の盾」の最大耐久値。 * **淫乱度 (Lust):** 快楽への依存。盾の防御力(ダメージ軽減率)を下げる。 * **NTR度 (Netorare):** ライバル依存。盾破壊後に上昇する。 * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` 実装証拠: {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [4, 34], "path": "scripts/relationship/original_relationship_state.gd", "sha256": "d1bfabfd205becf6d3cf1d6b6c477393319b26b0e7504fd227c3714761101616", "text": "## Explicit facts only. Numeric values are not production initialization approval.\n## No update, attack, reduction, threshold or route policy is defined here.\nconst FIELDS := [\"subject_id\", \"protagonist_id\", \"rival_id\", \"affection\", \"lust\", \"netorare\", \"shield_current\", \"shield_max\"]\nvar _payload: Dictionary = {}\n\n\nstatic func from_snapshot(value: Variant) -> OriginalRelationshipState:\n\tif not value is Dictionary or value.size() != FIELDS.size():\n\t\treturn null\n\tfor field: String in FIELDS:\n\t\tif not value.has(field):\n\t\t\treturn null\n\tfor field: String in [\"subject_id\", \"protagonist_id\", \"rival_id\"]:\n\t\tif not (value[field] is String or value[field] is StringName) or String(value[field]).is_empty():\n\t\t\treturn null\n\tif value[\"subject_id\"] == value[\"protagonist_id\"] or value[\"subject_id\"] == value[\"rival_id\"] or value[\"protagonist_id\"] == value[\"rival_id\"]:\n\t\treturn null\n\tfor field: String in [\"affection\", \"lust\", \"netorare\", \"shield_current\", \"shield_max\"]:\n\t\tif not (value[field] is int or value[field] is float):\n\t\t\treturn null\n\t\tif value[field] is float and not is_finite(value[field]):\n\t\t\treturn null\n\tif value[\"shield_max\"] != value[\"affection\"] or value[\"shield_current\"] < 0 or value[\"shield_current\"] > value[\"shield_max\"]:\n\t\treturn null\n\tvar state := OriginalRelationshipState.new()\n\tstate._payload = value.duplicate(true)\n\treturn state\n\n\nfunc create_snapshot() -> Dictionary:\n\treturn _payload.duplicate(true)"} ### affection_max_invariant partial / owner: P18-01 入力時の最大値一致検証のみ。通常操作の回復・更新は欠損。 原本 docs/traceability/original/BASELINE.txt:140–140 ```text * **好感度 (Affection):** 主人公への愛。「愛の盾」の最大耐久値。 ``` 実装証拠: {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [20, 30], "path": "scripts/relationship/original_relationship_state.gd", "sha256": "d1bfabfd205becf6d3cf1d6b6c477393319b26b0e7504fd227c3714761101616", "text": "\t\treturn null\n\tfor field: String in [\"affection\", \"lust\", \"netorare\", \"shield_current\", \"shield_max\"]:\n\t\tif not (value[field] is int or value[field] is float):\n\t\t\treturn null\n\t\tif value[field] is float and not is_finite(value[field]):\n\t\t\treturn null\n\tif value[\"shield_max\"] != value[\"affection\"] or value[\"shield_current\"] < 0 or value[\"shield_current\"] > value[\"shield_max\"]:\n\t\treturn null\n\tvar state := OriginalRelationshipState.new()\n\tstate._payload = value.duplicate(true)\n\treturn state"} ### snapshot_container partial / owner: P18-01 専用状態と旧値の分離保存・復元。人物別ルート進行保存を意味しない。 原本 docs/traceability/original/BASELINE.txt:138–143 ```text 3つの感情パラメータと防御値「愛の盾」、直接対決「決闘」によってヒロインの運命(純愛・NTR・堕落)をシミュレートする。 ## 7.2 感情パラメータと「愛の盾」 * **好感度 (Affection):** 主人公への愛。「愛の盾」の最大耐久値。 * **淫乱度 (Lust):** 快楽への依存。盾の防御力(ダメージ軽減率)を下げる。 * **NTR度 (Netorare):** ライバル依存。盾破壊後に上昇する。 * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` 実装証拠: {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [423, 479], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "\t\tlegacy[&\"threshold_candidates\"] = current_candidates\n\tlegacy[&\"next_candidate_sequence\"] = _next_candidate_sequence\n\tvar result := _container_raw.duplicate(true)\n\tresult[&\"version\"] = SNAPSHOT_VERSION\n\tresult[&\"legacy\"] = legacy\n\t# Compatibility projection for existing snapshot consumers; the nested v1\n\t# record remains lossless, including extension names reserved by v2.\n\tif result.get(&\"relationships\") != relationships:\n\t\tresult[&\"relationships\"] = relationships.duplicate(true)\n\tvar originals: Array[Dictionary] = []\n\tfor payload: Dictionary in _original_records.values():\n\t\toriginals.append(payload.duplicate(true))\n\tif result.get(&\"original_relationships\") != originals:\n\t\tresult[&\"original_relationships\"] = originals\n\treturn result\n\n\nstatic func _merge_legacy_changes(raw: Dictionary, baseline: Dictionary, current: Dictionary) -> Dictionary:\n\tvar result := raw.duplicate(true)\n\tfor key: Variant in baseline:\n\t\tif not current.has(key):\n\t\t\tresult.erase(key)\n\tfor key: Variant in current:\n\t\tif baseline.has(key) and current[key] == baseline[key]:\n\t\t\tcontinue\n\t\tif current[key] is Dictionary and baseline.get(key) is Dictionary and result.get(key) is Dictionary:\n\t\t\tresult[key] = _merge_legacy_changes(result[key], baseline[key], current[key])\n\t\telse:\n\t\t\tresult[key] = current[key]\n\treturn result\n\n\nfunc restore_snapshot(snapshot: Dictionary) -> bool:\n\tvar version: Variant = _value(snapshot, &\"version\", null)\n\tif not version is int or version not in [1, SNAPSHOT_VERSION]:\n\t\tlast_error = \"Unsupported Relationship snapshot version.\"\n\t\treturn false\n\tvar legacy: Variant = snapshot if version == 1 else _value(snapshot, &\"legacy\", null)\n\tvar originals: Variant = [] if version == 1 else _value(snapshot, &\"original_relationships\", null)\n\tif not legacy is Dictionary or not originals is Array:\n\t\tlast_error = \"Malformed Relationship snapshot container.\"\n\t\treturn false\n\tif version == SNAPSHOT_VERSION and _value(snapshot, &\"relationships\", null) != _value(legacy, &\"relationships\", null):\n\t\tlast_error = \"Legacy compatibility projection disagrees with its source.\"\n\t\treturn false\n\tvar original_records: Dictionary = {}\n\tfor raw: Variant in originals:\n\t\tvar state := OriginalStateType.from_snapshot(raw)\n\t\tif state == null or original_records.has(state.subject_id()):\n\t\t\tlast_error = \"Invalid or duplicate original relationship.\"\n\t\t\treturn false\n\t\tif not _original_identity_validator.is_valid() or not bool(_original_identity_validator.call(state.create_snapshot())):\n\t\t\tlast_error = \"Invalid original relationship identity reference.\"\n\t\t\treturn false\n\t\toriginal_records[state.subject_id()] = state.create_snapshot()\n\tvar parsed := _parse_snapshot(legacy)\n\tif not bool(parsed.get(&\"ok\", false)):"} ### identity_registration partial / owner: P19-01 Runtimeは登録済み人物・相互対応を検証。既存カタログのヒロインはアンリのみ。通常ルート入口ではない。 原本 docs/traceability/original/BASELINE.txt:138–138 ```text 3つの感情パラメータと防御値「愛の盾」、直接対決「決闘」によってヒロインの運命(純愛・NTR・堕落)をシミュレートする。 ``` 実装証拠: {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [6791, 6812], "path": "autoload/simulation_runtime.gd", "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", "text": "func _original_relationship_identities_valid(payload: Dictionary, staff_registry: StaffService, catalog: MvpContentCatalog) -> bool:\n\tif payload.get(\"protagonist_id\") != \"player\" or staff_registry == null:\n\t\treturn false\n\tvar subject := StringName(payload.get(\"subject_id\", \"\"))\n\tvar rival := StringName(payload.get(\"rival_id\", \"\"))\n\tif subject == &\"player\" or rival == &\"player\" or subject == rival or not staff_registry.has_staff(subject):\n\t\treturn false\n\tvar heroine_definition := catalog.get_entry(&\"unique_characters\", subject)\n\tvar rival_definition := catalog.get_entry(&\"unique_characters\", rival)\n\tvar subject_staff := staff_registry.get_staff(subject)\n\treturn subject_staff.employment_kind == StaffRuntime.EmploymentKind.UNIQUE \\\n\t\tand heroine_definition.get(&\"role_id\") == String(subject_staff.role_id) \\\n\t\tand heroine_definition.get(&\"character_kind\") == \"heroine\" \\\n\t\tand rival_definition.get(&\"character_kind\") == \"rival\" \\\n\t\tand heroine_definition.get(&\"counterpart_id\") == String(rival) \\\n\t\tand rival_definition.get(&\"counterpart_id\") == String(subject)\n\n\nfunc _execute_register_original_relationship(command: SimulationCommand) -> CommandResult:\n\tvar result := relationship_service.register_original_relationship(command.payload)\n\tresult.command_id = command.command_id\n\treturn result"} ### legacy_event_ui missing / owner: P19-01 既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。 原本 docs/traceability/original/BASELINE.txt:154–157 ```text ## 7.5 ルート攻略とプレイヤーアクション * **純愛:** デート・会話で盾を回復。ライバルを物理的に隔離、または決闘で排除。 * **NTR:** 意図的に放置・アングラ労働で盾を弱体化させ、覗き部屋から寝取られる過程を鑑賞する。 * **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。 ``` 実装証拠: "original conformance missing; see legacy_evidence" 旧実装: legacy_not_original / P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals. 旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): [{"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "fff37f082d750bb91c71f2aa54d168c9e2cb8fe7", "lines": [98, 101], "path": "scenes/main/main.gd", "sha256": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a", "text": "const EVENT_CHOICE_NAMES := {\n\t&\"event.relationship.threshold.acknowledge\": \"向き合う\",\n\t&\"event.relationship.threshold.defer\": \"今は保留する\",\n}"}] ### defense_reduction missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:141–141 ```text * **淫乱度 (Lust):** 快楽への依存。盾の防御力(ダメージ軽減率)を下げる。 ``` 実装証拠: "original conformance missing" ### post_break_metric missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:142–143 ```text * **NTR度 (Netorare):** ライバル依存。盾破壊後に上昇する。 * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` 実装証拠: "original conformance missing" ### barrier_block missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:143–143 ```text * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` 実装証拠: "original conformance missing" ### coassignment_attack missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:145–145 ```text 1. **盾への攻撃:** ライバルと同配置時、盾耐久値が減少。 ``` 実装証拠: "original conformance missing; see legacy_evidence" 旧実装: legacy_not_original / P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals. 旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): [{"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a", "lines": [264, 312], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "func apply_shield_attack(\n\trelationship_id: StringName,\n\taction_id: StringName,\n\tabsolute_minute: int,\n\tterms: Dictionary\n) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif action_id.is_empty() or absolute_minute < 0:\n\t\treturn _invalid(\"ShieldAttack requires an Action ID and non-negative minute.\")\n\tvar day := absolute_minute / 1_440\n\t_reset_attack_day_if_needed(state, day)\n\tvar uses_before := int(state.action_counts.get(action_id, 0))\n\tvar daily_limit := maxi(int(_value(terms, &\"daily_limit\", 4)), 1)\n\tif uses_before >= daily_limit:\n\t\treturn _invalid(\"ShieldAction daily use limit reached.\", {\n\t\t\t&\"action_id\": action_id,\n\t\t\t&\"uses\": uses_before,\n\t\t\t&\"daily_limit\": daily_limit,\n\t\t})\n\tvar penalty_percent := _repetition_penalty_percent(uses_before)\n\tvar raw_damage := (\n\t\tint(_value(terms, &\"base_damage\", 0))\n\t\t+ int(_value(terms, &\"owner_stat_bonus\", 0))\n\t\t+ int(_value(terms, &\"intel_bonus\", 0))\n\t\t+ int(_value(terms, &\"event_bonus\", 0))\n\t\t- int(_value(terms, &\"target_resistance\", 0))\n\t)\n\tvar max_damage := maxi(int(_value(terms, &\"max_damage\", raw_damage)), 0)\n\tvar damage := clampi((maxi(raw_damage, 0) * (100 - penalty_percent)) / 100, 0, max_damage)\n\tvar old_value := state.shield_current\n\tstate.shield_current = maxi(old_value - damage, 0)\n\tstate.action_counts[action_id] = uses_before + 1\n\tstate.daily_attack_count += 1\n\tif old_value != state.shield_current:\n\t\tshield_changed.emit(relationship_id, old_value, state.shield_current)\n\tlast_error = \"\"\n\treturn _success({\n\t\t&\"relationship_id\": relationship_id,\n\t\t&\"action_id\": action_id,\n\t\t&\"uses_before\": uses_before,\n\t\t&\"penalty_percent\": penalty_percent,\n\t\t&\"raw_damage\": raw_damage,\n\t\t&\"damage\": damage,\n\t\t&\"old_shield\": old_value,\n\t\t&\"new_shield\": state.shield_current,\n\t\t&\"shield_broken\": old_value > 0 and state.shield_current == 0,\n\t})"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460", "lines": [6850, 6850], "path": "autoload/simulation_runtime.gd", "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", "text": "\tvar result := relationship_service.apply_shield_attack("}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a", "lines": [1039, 1039], "path": "scripts/events/event_service.gd", "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", "text": "\t\t\tresult = _relationship_service.apply_shield_attack("}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "62fe3db04b22501b703e5836174652aaddf702c3", "lines": [536, 565], "path": "scripts/relationship/placement_risk_preview_service.gd", "sha256": "d8e974487b75fbad49ecbbe1da8e36aac23dc4e1a5cf10281a1c567c97dd59f6", "text": "func _contact_summary(\n\theroine_shifts: Array,\n\trival_shifts: Array,\n\tperiod: Dictionary\n) -> Dictionary:\n\tvar raw_overlaps: Array[Dictionary] = []\n\tfor heroine_shift: Dictionary in heroine_shifts:\n\t\tfor rival_shift: Dictionary in rival_shifts:\n\t\t\tif heroine_shift[&\"facility_id\"] != rival_shift[&\"facility_id\"]:\n\t\t\t\tcontinue\n\t\t\tvar start_at := maxi(\n\t\t\t\tmaxi(int(period[&\"start_at\"]), int(heroine_shift[&\"start_at\"])),\n\t\t\t\tint(rival_shift[&\"start_at\"])\n\t\t\t)\n\t\t\tvar end_at := mini(\n\t\t\t\tmini(int(period[&\"end_at\"]), int(heroine_shift[&\"end_at\"])),\n\t\t\t\tint(rival_shift[&\"end_at\"])\n\t\t\t)\n\t\t\t# Half-open intervals touch only when start < end. Adjacent shifts\n\t\t\t# therefore contribute zero phantom minutes.\n\t\t\tif start_at >= end_at:\n\t\t\t\tcontinue\n\t\t\tif raw_overlaps.size() >= MAX_CONTACT_INTERVALS:\n\t\t\t\tbreak\n\t\t\traw_overlaps.append({\n\t\t\t\t&\"facility_id\": heroine_shift[&\"facility_id\"],\n\t\t\t\t&\"start_at\": start_at,\n\t\t\t\t&\"end_at\": end_at,\n\t\t\t\t&\"heroine_shift_id\": heroine_shift[&\"shift_id\"],\n\t\t\t\t&\"rival_shift_id\": rival_shift[&\"shift_id\"],"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "62fe3db04b22501b703e5836174652aaddf702c3", "lines": [619, 640], "path": "scripts/relationship/placement_risk_preview_service.gd", "sha256": "d8e974487b75fbad49ecbbe1da8e36aac23dc4e1a5cf10281a1c567c97dd59f6", "text": "func _shield_attack_candidates(\n\trelationship: Dictionary,\n\teffects: Dictionary,\n\tcontacts: Array\n) -> Dictionary:\n\tvar attack_points: Array[Dictionary] = []\n\tfor facility: Dictionary in contacts:\n\t\tfor interval: Dictionary in facility[&\"intervals\"]:\n\t\t\tif int(interval[&\"minutes\"]) < MIN_SHIELD_CONTACT_MINUTES:\n\t\t\t\tcontinue\n\t\t\tvar trigger_at := int(interval[&\"start_at\"]) + MIN_SHIELD_CONTACT_MINUTES - 1\n\t\t\twhile trigger_at < int(interval[&\"end_at\"]):\n\t\t\t\tattack_points.append({\n\t\t\t\t\t&\"facility_id\": facility[&\"facility_id\"],\n\t\t\t\t\t&\"contact_interval\": {\n\t\t\t\t\t\t&\"start_at\": interval[&\"start_at\"],\n\t\t\t\t\t\t&\"end_at\": interval[&\"end_at\"],\n\t\t\t\t\t},\n\t\t\t\t\t&\"trigger_at\": trigger_at,\n\t\t\t\t\t&\"overlap_minutes\": interval[&\"minutes\"],\n\t\t\t\t})\n\t\t\t\ttrigger_at += SHIELD_ATTACK_INTERVAL_MINUTES"}] ### zero_break missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:146–146 ```text 2. **ブレイク:** 耐久値0で「心の隙間」発生。 ``` 実装証拠: "original conformance missing; see legacy_evidence" 旧実装: legacy_not_original / P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals. 旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): [{"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a", "lines": [264, 312], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "func apply_shield_attack(\n\trelationship_id: StringName,\n\taction_id: StringName,\n\tabsolute_minute: int,\n\tterms: Dictionary\n) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif action_id.is_empty() or absolute_minute < 0:\n\t\treturn _invalid(\"ShieldAttack requires an Action ID and non-negative minute.\")\n\tvar day := absolute_minute / 1_440\n\t_reset_attack_day_if_needed(state, day)\n\tvar uses_before := int(state.action_counts.get(action_id, 0))\n\tvar daily_limit := maxi(int(_value(terms, &\"daily_limit\", 4)), 1)\n\tif uses_before >= daily_limit:\n\t\treturn _invalid(\"ShieldAction daily use limit reached.\", {\n\t\t\t&\"action_id\": action_id,\n\t\t\t&\"uses\": uses_before,\n\t\t\t&\"daily_limit\": daily_limit,\n\t\t})\n\tvar penalty_percent := _repetition_penalty_percent(uses_before)\n\tvar raw_damage := (\n\t\tint(_value(terms, &\"base_damage\", 0))\n\t\t+ int(_value(terms, &\"owner_stat_bonus\", 0))\n\t\t+ int(_value(terms, &\"intel_bonus\", 0))\n\t\t+ int(_value(terms, &\"event_bonus\", 0))\n\t\t- int(_value(terms, &\"target_resistance\", 0))\n\t)\n\tvar max_damage := maxi(int(_value(terms, &\"max_damage\", raw_damage)), 0)\n\tvar damage := clampi((maxi(raw_damage, 0) * (100 - penalty_percent)) / 100, 0, max_damage)\n\tvar old_value := state.shield_current\n\tstate.shield_current = maxi(old_value - damage, 0)\n\tstate.action_counts[action_id] = uses_before + 1\n\tstate.daily_attack_count += 1\n\tif old_value != state.shield_current:\n\t\tshield_changed.emit(relationship_id, old_value, state.shield_current)\n\tlast_error = \"\"\n\treturn _success({\n\t\t&\"relationship_id\": relationship_id,\n\t\t&\"action_id\": action_id,\n\t\t&\"uses_before\": uses_before,\n\t\t&\"penalty_percent\": penalty_percent,\n\t\t&\"raw_damage\": raw_damage,\n\t\t&\"damage\": damage,\n\t\t&\"old_shield\": old_value,\n\t\t&\"new_shield\": state.shield_current,\n\t\t&\"shield_broken\": old_value > 0 and state.shield_current == 0,\n\t})"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460", "lines": [6850, 6850], "path": "autoload/simulation_runtime.gd", "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", "text": "\tvar result := relationship_service.apply_shield_attack("}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a", "lines": [1039, 1039], "path": "scripts/events/event_service.gd", "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", "text": "\t\t\tresult = _relationship_service.apply_shield_attack("}] ### contact_after_break missing / owner: P18-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:147–147 ```text 3. **NTR進行:** ライバル接触で直接NTR度が上昇。 ``` 実装証拠: "original conformance missing" ### threshold_route_loss missing / owner: P18-03 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:148–148 ```text 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。 ``` 実装証拠: "original conformance missing; see legacy_evidence" 旧実装: legacy_not_original / P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals. 旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): [{"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a", "lines": [315, 340], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "func request_route_lock(\n\trelationship_id: StringName,\n\trequested_lock: RelationshipState.RouteLock,\n\troute_id: StringName = &\"\",\n\tirreversible_event: bool = false\n) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif requested_lock < RelationshipStateType.RouteLock.NONE or requested_lock > RelationshipStateType.RouteLock.CLOSED:\n\t\treturn _invalid(\"Unknown Route Lock state.\")\n\tif requested_lock in [\n\t\tRelationshipStateType.RouteLock.EXCLUSIVE_PENDING,\n\t\tRelationshipStateType.RouteLock.EXCLUSIVE_LOCKED,\n\t] and route_id.is_empty():\n\t\treturn _invalid(\"Exclusive Route Lock requires a route ID.\")\n\tif requested_lock == RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED and not irreversible_event:\n\t\treturn _invalid(\"Exclusive Route cannot lock before explicit confirmation.\", {\n\t\t\t&\"required_state\": &\"EXCLUSIVE_PENDING\",\n\t\t})\n\tvar old_lock := state.route_lock\n\tstate.route_lock = requested_lock\n\tstate.route_id = route_id if requested_lock != RelationshipStateType.RouteLock.NONE else &\"\"\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"old_lock\": old_lock, &\"new_lock\": state.route_lock})"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a", "lines": [343, 355], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460", "lines": [342, 343], "path": "autoload/simulation_runtime.gd", "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", "text": "\tregister_command_executor(&\"request_route_lock\", Callable(self, \"_execute_request_route_lock\"))\n\tregister_command_executor(&\"confirm_route_lock\", Callable(self, \"_execute_confirm_route_lock\"))"}, {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a", "lines": [1047, 1047], "path": "scripts/events/event_service.gd", "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", "text": "\t\t\tresult = _relationship_service.request_route_lock("}] ### duel_types missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:150–151 ```text NTR阻止のための直接的解決手段。 * **種類:** 武力決闘、商談決闘、夜の決闘(性技対決)。 ``` 実装証拠: "original conformance missing" ### duel_win missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:152–152 ```text * **リターン:** ライバル追放・隷属化、「愛の盾」全回復。 ``` 実装証拠: "original conformance missing" ### duel_loss missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:153–153 ```text * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。 ``` 実装証拠: "original conformance missing" ### love_actions missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:155–155 ```text * **純愛:** デート・会話で盾を回復。ライバルを物理的に隔離、または決闘で排除。 ``` 実装証拠: "original conformance missing; see legacy_evidence" 旧実装: legacy_not_original / P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals. 旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): [{"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a", "lines": [246, 261], "path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "text": "func restore_shield(relationship_id: StringName, amount: int) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif amount < 0:\n\t\treturn _invalid(\"Shield restoration amount cannot be negative.\")\n\tvar old_value := state.shield_current\n\tstate.shield_current = clampi(old_value + amount, 0, state.shield_max)\n\tif old_value != state.shield_current:\n\t\tshield_changed.emit(relationship_id, old_value, state.shield_current)\n\tlast_error = \"\"\n\treturn _success({\n\t\t&\"old_value\": old_value,\n\t\t&\"new_value\": state.shield_current,\n\t\t&\"restored\": state.shield_current - old_value,\n\t})"}] ### ntr_actions missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:156–156 ```text * **NTR:** 意図的に放置・アングラ労働で盾を弱体化させ、覗き部屋から寝取られる過程を鑑賞する。 ``` 実装証拠: "original conformance missing" ### corruption_actions missing / owner: P19-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:157–157 ```text * **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。 ``` 実装証拠: "original conformance missing" ### history_fields missing / owner: P19-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:159–159 ```text * **履歴:** 処女喪失相手、経験数、現在のパートナーを記録。 ``` 実装証拠: "original conformance missing" ### history_cycle_parentage missing / owner: P19-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:160–160 ```text * **妊娠:** 排卵日あり。父親判定、妊婦期の外見・ステータス変化。 ``` 実装証拠: "original conformance missing" ### portrait_marks missing / owner: P26-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:161–161 ```text * **刻印:** 指輪(純愛)、キスマーク(NTR)、淫紋・首輪・焼印(堕落・家畜)が立ち絵に反映される。 ``` 実装証拠: "original conformance missing" ### route_skills missing / owner: P20-01 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:132–132 ```text * **ルート変化:** 純愛/堕落などの進行度で習得するスキルが変化する。 ``` 実装証拠: "original conformance missing" ### departure missing / owner: P19-02 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 原本 docs/traceability/original/BASELINE.txt:135–135 ```text * **離脱:** 原則ロストしないが、防衛戦敗北での一時拉致や、特定バッドエンド確定時にのみ敵や背景オブジェクト化する。 ``` 実装証拠: "original conformance missing" ## anri / アンリ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [118, 118] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [118, 118] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [118, 118] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [118, 118] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [118, 118] ## anri / アンリ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [118, 118] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [118, 118] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [118, 118] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [118, 118] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [118, 118] ## anri / アンリ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [118, 118] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [118, 118] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [118, 118] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [118, 118] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [118, 118] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [118, 118] ## fine / フィーネ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [119, 119] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [119, 119] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [119, 119] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [119, 119] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [119, 119] ## fine / フィーネ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [119, 119] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [119, 119] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [119, 119] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [119, 119] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [119, 119] ## fine / フィーネ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [119, 119] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [119, 119] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [119, 119] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [119, 119] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [119, 119] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [119, 119] ## tomari / トマリ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [120, 120] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [120, 120] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [120, 120] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [120, 120] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [120, 120] ## tomari / トマリ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [120, 120] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [120, 120] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [120, 120] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [120, 120] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [120, 120] ## tomari / トマリ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [120, 120] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [120, 120] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [120, 120] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [120, 120] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [120, 120] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [120, 120] ## amelia / アメリア / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [121, 121] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [121, 121] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [121, 121] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [121, 121] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [121, 121] ## amelia / アメリア / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [121, 121] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [121, 121] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [121, 121] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [121, 121] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [121, 121] ## amelia / アメリア / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [121, 121] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [121, 121] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [121, 121] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [121, 121] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [121, 121] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [121, 121] ## liz / リズ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [122, 122] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [122, 122] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [122, 122] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [122, 122] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [122, 122] ## liz / リズ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [122, 122] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [122, 122] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [122, 122] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [122, 122] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [122, 122] ## liz / リズ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [122, 122] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [122, 122] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [122, 122] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [122, 122] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [122, 122] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [122, 122] ## mimi / ミミ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [123, 123] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [123, 123] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [123, 123] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [123, 123] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [123, 123] ## mimi / ミミ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [123, 123] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [123, 123] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [123, 123] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [123, 123] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [123, 123] ## mimi / ミミ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [123, 123] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [123, 123] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [123, 123] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [123, 123] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [123, 123] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [123, 123] ## satsuki / サツキ / 純愛 - entry_required_events: 共通 [identity_registration, love_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [124, 124] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [124, 124] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [124, 124] - route_selection_effects: 共通 [threshold_route_loss, love_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [124, 124] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [124, 124] ## satsuki / サツキ / NTR - entry_required_events: 共通 [identity_registration, ntr_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [124, 124] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [124, 124] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [124, 124] - route_selection_effects: 共通 [threshold_route_loss, ntr_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [124, 124] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [124, 124] ## satsuki / サツキ / 堕落 - entry_required_events: 共通 [identity_registration, corruption_actions] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-01 / 原本 [138, 161]・人物 [124, 124] - state_conditions: 共通 [state_fields, affection_max_invariant, defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P18-02 / 原本 [138, 161]・人物 [124, 124] - duel_effects: 共通 [duel_types, duel_win, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-01 / 原本 [138, 161]・人物 [124, 124] - route_selection_effects: 共通 [threshold_route_loss, corruption_actions, route_skills] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P26-02 / 原本 [138, 161]・人物 [124, 124] - interruption_cancellation: 共通 [departure, threshold_route_loss, duel_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] 原本中断参照: [{"path": "docs/traceability/original/BASELINE.txt", "lines": [148, 148], "text": " 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}, {"path": "docs/traceability/original/BASELINE.txt", "lines": [153, 153], "text": " * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a"}] 旧確定ロック legacy_not_original: [{"path": "scripts/relationship/relationship_service.gd", "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [343, 355], "text": "func confirm_route_lock(relationship_id: StringName, route_id: StringName) -> CommandResult:\n\tvar state := get_relationship(relationship_id)\n\tif state == null:\n\t\treturn _not_found(\"Relationship\", relationship_id)\n\tif state.route_lock != RelationshipStateType.RouteLock.EXCLUSIVE_PENDING:\n\t\treturn _invalid(\"Route is not awaiting exclusive confirmation.\")\n\tif route_id.is_empty() or state.route_id != route_id:\n\t\treturn _invalid(\"Route confirmation does not match the pending route.\")\n\tvar old_lock := state.route_lock\n\tstate.route_lock = RelationshipStateType.RouteLock.EXCLUSIVE_LOCKED\n\troute_lock_changed.emit(relationship_id, old_lock, state.route_lock, state.route_id)\n\tlast_error = \"\"\n\treturn _success({&\"route_id\": route_id, &\"new_lock\": state.route_lock})", "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a"}] - save_handling: 共通 [snapshot_container] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - history_marks: 共通 [history_fields, history_cycle_parentage, portrait_marks] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-02 / 原本 [138, 161]・人物 [124, 124] - current_reachability: 共通 [identity_registration, threshold_route_loss] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P20-02 / 原本 [138, 161]・人物 [124, 124] ## ルート別適用性 ### 純愛 - UI: 欠損: 原本行動・3種決闘・原本3軸/盾の通常操作なし。既存汎用関係UIを原本ルートとしない。 - Runtime: partial: 原本明示状態の登録・identity検証のみ。共通更新と通常ルート到達は欠損。 - save: partial: 専用状態/旧値コンテナ保存あり。人物固有進行・中断再開は欠損。 - Windows: 未受入: global same-Windows acceptanceはopen。文書単位のnative GUI/Windows実行は適用外。 - 欠損機構: defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break, threshold_route_loss, duel_types, duel_win, duel_loss, love_actions, ntr_actions, corruption_actions, history_fields, history_cycle_parentage, portrait_marks, route_skills, departure ### NTR - UI: 欠損: 原本行動・3種決闘・原本3軸/盾の通常操作なし。既存汎用関係UIを原本ルートとしない。 - Runtime: partial: 原本明示状態の登録・identity検証のみ。共通更新と通常ルート到達は欠損。 - save: partial: 専用状態/旧値コンテナ保存あり。人物固有進行・中断再開は欠損。 - Windows: 未受入: global same-Windows acceptanceはopen。文書単位のnative GUI/Windows実行は適用外。 - 欠損機構: defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break, threshold_route_loss, duel_types, duel_win, duel_loss, love_actions, ntr_actions, corruption_actions, history_fields, history_cycle_parentage, portrait_marks, route_skills, departure ### 堕落 - UI: 欠損: 原本行動・3種決闘・原本3軸/盾の通常操作なし。既存汎用関係UIを原本ルートとしない。 - Runtime: partial: 原本明示状態の登録・identity検証のみ。共通更新と通常ルート到達は欠損。 - save: partial: 専用状態/旧値コンテナ保存あり。人物固有進行・中断再開は欠損。 - Windows: 未受入: global same-Windows acceptanceはopen。文書単位のnative GUI/Windows実行は適用外。 - 欠損機構: defense_reduction, post_break_metric, barrier_block, coassignment_attack, zero_break, contact_after_break, threshold_route_loss, duel_types, duel_win, duel_loss, love_actions, ntr_actions, corruption_actions, history_fields, history_cycle_parentage, portrait_marks, route_skills, departure Authority snapshots: anchored_base_commit=8ca9263fee1ec4374d97c01fda82b95e1df6a977; JSON retains anchored blob SHA-256 and projected definition records. D05/D08、閾値・率・初期値はpending。完全な出典本文・SHA・原子要件全レコードはJSONに保持する。 14/88 unchanged; formal Runner validation, independent whole-unit Opus review and normal integration/final required; no game acceptance