130 KiB
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
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
* **好感度 (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
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
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
## 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
* **淫乱度 (Lust):** 快楽への依存。盾の防御力(ダメージ軽減率)を下げる。
実装証拠: "original conformance missing"
post_break_metric
missing / owner: P18-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:142–143
* **NTR度 (Netorare):** ライバル依存。盾破壊後に上昇する。
* **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。
実装証拠: "original conformance missing"
barrier_block
missing / owner: P18-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:143–143
* **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。
実装証拠: "original conformance missing"
coassignment_attack
missing / owner: P18-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:145–145
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
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
3. **NTR進行:** ライバル接触で直接NTR度が上昇。
実装証拠: "original conformance missing"
threshold_route_loss
missing / owner: P18-03
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:148–148
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
NTR阻止のための直接的解決手段。
* **種類:** 武力決闘、商談決闘、夜の決闘(性技対決)。
実装証拠: "original conformance missing"
duel_win
missing / owner: P19-01
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:152–152
* **リターン:** ライバル追放・隷属化、「愛の盾」全回復。
実装証拠: "original conformance missing"
duel_loss
missing / owner: P19-01
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:153–153
* **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。
実装証拠: "original conformance missing"
love_actions
missing / owner: P19-01
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:155–155
* **純愛:** デート・会話で盾を回復。ライバルを物理的に隔離、または決闘で排除。
実装証拠: "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
* **NTR:** 意図的に放置・アングラ労働で盾を弱体化させ、覗き部屋から寝取られる過程を鑑賞する。
実装証拠: "original conformance missing"
corruption_actions
missing / owner: P19-01
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:157–157
* **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。
実装証拠: "original conformance missing"
history_fields
missing / owner: P19-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:159–159
* **履歴:** 処女喪失相手、経験数、現在のパートナーを記録。
実装証拠: "original conformance missing"
history_cycle_parentage
missing / owner: P19-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:160–160
* **妊娠:** 排卵日あり。父親判定、妊婦期の外見・ステータス変化。
実装証拠: "original conformance missing"
portrait_marks
missing / owner: P26-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:161–161
* **刻印:** 指輪(純愛)、キスマーク(NTR)、淫紋・首輪・焼印(堕落・家畜)が立ち絵に反映される。
実装証拠: "original conformance missing"
route_skills
missing / owner: P20-01
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:132–132
* **ルート変化:** 純愛/堕落などの進行度で習得するスキルが変化する。
実装証拠: "original conformance missing"
departure
missing / owner: P19-02
原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。
原本 docs/traceability/original/BASELINE.txt:135–135
* **離脱:** 原則ロストしないが、防衛戦敗北での一時拉致や、特定バッドエンド確定時にのみ敵や背景オブジェクト化する。
実装証拠: "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
D05/D08、閾値・率・初期値はpending。完全な出典本文・SHA・原子要件全レコードはJSONに保持する。
14/88 unchanged; formal Runner validation, independent whole-unit Opus review and normal integration/final required; no game acceptance