From 806de25068bc423136063791afcea811d251ee1b Mon Sep 17 00:00:00 2001 From: Agent Control Runner Date: Sat, 17 Oct 2026 19:49:30 +0900 Subject: [PATCH] =?UTF-8?q?P19-03-TABLE:=20P19-03=20=E5=88=86=E5=B2=90?= =?UTF-8?q?=E3=81=AE=E5=88=B0=E9=81=94=E6=80=A7=EF=BC=9A=E5=8E=9F7?= =?UTF-8?q?=E5=90=8D=C3=973=E3=83=AB=E3=83=BC=E3=83=88=E3=81=AE=E5=85=A8?= =?UTF-8?q?=E5=88=B0=E9=81=94=E8=A1=A8=E3=81=A8=E6=9C=AA=E5=88=B6=E4=BD=9C?= =?UTF-8?q?=E6=AC=A0=E6=90=8D=E7=9B=A3=E6=9F=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../execution/p19-03/IMPLEMENTATION_REPORT.md | 45 +- .../execution/p19-03/REACHABILITY_TABLE.json | 1430 ++++++++++++++--- .../execution/p19-03/REACHABILITY_TABLE.md | 144 +- .../p19-03/check_reachability_table.py | 77 +- .../p19-03/test_reachability_table.py | 33 + 5 files changed, 1419 insertions(+), 310 deletions(-) diff --git a/docs/plans/original-completion-2026-10-02/execution/p19-03/IMPLEMENTATION_REPORT.md b/docs/plans/original-completion-2026-10-02/execution/p19-03/IMPLEMENTATION_REPORT.md index 1067233..3616228 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p19-03/IMPLEMENTATION_REPORT.md +++ b/docs/plans/original-completion-2026-10-02/execution/p19-03/IMPLEMENTATION_REPORT.md @@ -4,7 +4,7 @@ ## 変更範囲 -このディレクトリの必須5ファイルのみを追加した。原本、原子要件、work packages、decisions、TASK_SPEC、選定記録、frozen pins、ゲーム入力、marker registryは変更していない。git書込み、他worker起動、Runner操作、ゲーム起動は行っていない。素材追加なし。 +修復開始点e0420d57a381a1644357f0590536e1d47c9bca9fから、このディレクトリの指定5ファイルのみを変更した。原本、原子要件、work packages、decisions、TASK_SPEC、選定記録、frozen pins、ゲーム入力、marker registryは変更していない。git書込み、他worker起動、Runner操作、ゲーム起動は行っていない。素材追加なし。 ## 要件と検査の対応 @@ -26,36 +26,45 @@ 指定されたoriginal_relationship_state.gdには7名のrosterはなく、汎用subject_id等の明示入力検証のみがある。既存unique catalogのヒロインはheroine_anriのみ。監査IDには既存atomic entity.key(anri/fine/tomari/amelia/liz/mimi/satsuki)を使い、他6名の実装catalog ID、ライバル対応、初期値を創作していない。この実装欠損は表の欠損であり、原7名を削減する理由にしていない。 -## 実行記録 +## Repair 1: 4指摘の対応 -以下は生成・静的観測であり正式試験結果ではない。 +編集前に build/owner-handoff/p19-review-r01/ の ACTUAL_OPUS_REPAIR_DIRECTION.json、ACTUAL_WHOLE_UNIT_REVIEW.json、SPEC_HASH_REPRESENTATIONS.json を読んだ。 + +- MEDIUM: coassignment_attack / zero_break / love_actions / threshold_route_loss と旧UIのlegacy_evidenceを追加。固定anchorの実際の本文・行・Git blob OID・file-bytes SHA-256を保持する。原本準拠statusはmissing、旧実装分類はlegacy_not_originalに統一。P18-01は一対一変換を禁止し、旧数値・日次制限は原本として未承認と明記した。UI定数は実際には98–101行であり、89–97行の無関係なラベルを除いた。共通ルール参照により各該当セルへ結び付けた。所有者・原本欠損・natural_route_complete=falseを維持。 +- LOW 独立試験: validate_legacyは候補とcanonicalの比較とは独立に、git showで固定anchorのソースを読み、引用行本文とgit rev-parseによるblob OID、現ファイルとの一致を検査する。test_independent_legacy_source_evidenceは実際のJSONと実ファイルを開き、git hash-object --stdin(書込みなし)でOIDを独立計算し、関数名とshield_broken/EXCLUSIVE_LOCKEDも確認。test_legacy_evidence_required_independentlyは対象全項目の証拠削除・空配列・無条件not implemented・古いOID/本文を拒否する。 +- LOW 中断参照: 全21セルのinterruption_cancellationに原本148・153行の本文とbaseline hash、および343–355行のconfirm_route_lockをlegacy_not_originalとして追加。人物固有欠損と担当は維持。 +- LOW ハッシュ表示: 263a01b943d8056727335fb76977c010298e1c229077f8da76e48683ba2e89bb は TASK_SPEC.json file-bytes SHA-256。3af3d9b931edc5449796662ad69bb6f67c80b48827a86565b1952931db68dd15 は Runner git-show stripped-UTF-8 contract spec_sha256。上記SPEC_HASH_REPRESENTATIONS.jsonのunchanged_file=trueが証拠であり、両者は同じ無変更ファイルを表す。checker定数と出力にも区別を反映。Git blob OIDは別のgit_blob_oidフィールドでありfile-bytes SHA-256とは区別する。 + +## 実行記録(今回のローカル確認) + +以下は正式Runner実行ではない。記録済み修復指示に基づき3登録コマンドをローカル実行した。 + +生成 — exit 0 ```sh -python3 -B docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root . --write +python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --write ``` -生成時に2回実行し、どちらもexit 0。actual_commit=8ca9263fee1ec4374d97c01fda82b95e1df6a977、selected_files=1368、file_equality=true、anchor=1b07b87d3736e777932315a4bdde8b70cbf9cb23、native_evidence_reuse_accepted=false。最終回はUI証拠・catalog行範囲・Markdown共通検証関数の更新後。--writeは全固定入力を照合してJSON/Markdownを生成するが、自己試験またはRunner受入を代替しない。 - -別途read-only Pythonでrun_all_tests.pyと同じsource選択を再現し、1368/1368、missing=[]、new=[]、changed=[]、engine SHA一致を確認した。JSONの静的読込で21セルと61原子レコードを確認した。原本表示には `nl -ba docs/traceability/original/BASELINE.txt | sed -n '85,165p'` を使用した。原資料/既存コードはcat、sed、rgとJSON読込で確認した。 - -初期の読込用here-documentはshellの一時ファイル作成制限によりexit 1。その後python3 -cで同じ静的読込を行った。製品ファイルへの影響はない。 +p19-table — exit 0 ```sh -python3 -c 'import ast;from pathlib import Path;p=Path("docs/plans/original-completion-2026-10-02/execution/p19-03");[(ast.parse((p/n).read_text()),print(n,"syntax parsed")) for n in ["check_reachability_table.py","test_reachability_table.py"]]' -git diff --stat -git status --short +python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --check ``` -構文読込は2ファイルともexit 0。git差分確認では既存trackedファイルの変更なし、追加は許可ディレクトリの必須5ファイルのみ。試験実行ではない。 - -ユーザーの最新指示「試験はRunnerが正式実行します」に従い、下記は**未実行**。合格を主張しない。 +p19-negative — exit 0 ```sh -python3 -B docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root . --check -python3 -B docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py --project-root . -python3 -B docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root . --source-binding-only +python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement ``` +p19-source-binding — exit 0 + +```sh +python3 -B /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py --project-root /Users/korizatou114/Projects/TheTree-managed-worktrees/p19-03-reachability/P19-03-TABLE-implement --source-binding-only +``` + +--writeの実際の呼出しは同一checkout内で相対スクリプトパスと --project-root . を使用(上記は絶対パス表記)。--checkはMarkdownのバイト完全一致を確認。自己試験は12件OK。source bindingは1368ファイル一致、file_equality=true、actual_commit=e0420d57a381a1644357f0590536e1d47c9bca9f、native_evidence_reuse_accepted=false。git diff --checkはexit 0。構文は上記Python実行で確認。最初の編集用here-documentは一時ファイル作成制限でexit 1、変更は行われず、python3 -cで再実行してexit 0。native full・ゲーム起動・git書込み・Runner操作・他エージェント起動は行っていない。 + ## 残る親成果・ゲームの欠損 - P18-01: 原本3軸/盾の通常UI、承認済み初期値、本来の全単位受入。P18-02/03: 同配置・軽減・ブレイク・接触・閾値・確定遷移。既存旧汎用モデルの閾値を原本へ転用しない。 diff --git a/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.json b/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.json index aca7d74..2351bb3 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.json +++ b/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.json @@ -119,20 +119,26 @@ "text": "## 7.5 ルート攻略とプレイヤーアクション\n * **純愛:** デート・会話で盾を回復。ライバルを物理的に隔離、または決闘で排除。\n * **NTR:** 意図的に放置・アングラ労働で盾を弱体化させ、覗き部屋から寝取られる過程を鑑賞する。\n * **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, - "status": "partial", - "implementation": { - "path": "scenes/main/main.gd", - "sha256": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a", - "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", - "lines": [ - 89, - 101 - ], - "text": "\t&\"NOT_UNDERGROUND\": \"地下のマスだけ掘削できます\",\n\t&\"ALREADY_EXCAVATED\": \"すでに掘削済みです\",\n\t&\"ALREADY_RESERVED\": \"このマスは掘削中です\",\n\t&\"NO_EXCAVATED_NEIGHBOR\": \"掘削済みの隣接マスから延ばしてください\",\n\t&\"NO_ENTRANCE_CONNECTION\": \"地上入口までつながる経路がありません\",\n\t&\"SUPPORT_REQUIRED\": \"硬い地盤を支える補強施設が必要です\",\n\t&\"INSUFFICIENT_RESOURCES\": \"掘削資源が不足しています\",\n\t&\"MISSING_DEPENDENCY\": \"掘削システムを利用できません\",\n}\nconst EVENT_CHOICE_NAMES := {\n\t&\"event.relationship.threshold.acknowledge\": \"向き合う\",\n\t&\"event.relationship.threshold.defer\": \"今は保留する\",\n}" - }, + "status": "missing", + "implementation": "original conformance missing; see legacy_evidence", "owner": "P19-01", "observation": "既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。", - "gap": "欠損: 既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。" + "gap": "欠損: 既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。 P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "path": "scenes/main/main.gd", + "sha256": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 98, + 101 + ], + "text": "const EVENT_CHOICE_NAMES := {\n\t&\"event.relationship.threshold.acknowledge\": \"向き合う\",\n\t&\"event.relationship.threshold.defer\": \"今は保留する\",\n}", + "git_blob_oid": "fff37f082d750bb91c71f2aa54d168c9e2cb8fe7" + } + ] }, { "id": "defense_reduction", @@ -146,7 +152,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -163,7 +169,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -180,7 +186,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -197,10 +203,69 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing; see legacy_evidence", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", - "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" + "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "path": "scripts/relationship/relationship_service.gd", + "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 264, + 312 + ], + "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})", + "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a" + }, + { + "path": "autoload/simulation_runtime.gd", + "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 6850, + 6850 + ], + "text": "\tvar result := relationship_service.apply_shield_attack(", + "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460" + }, + { + "path": "scripts/events/event_service.gd", + "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 1039, + 1039 + ], + "text": "\t\t\tresult = _relationship_service.apply_shield_attack(", + "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a" + }, + { + "path": "scripts/relationship/placement_risk_preview_service.gd", + "sha256": "d8e974487b75fbad49ecbbe1da8e36aac23dc4e1a5cf10281a1c567c97dd59f6", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 536, + 565 + ], + "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\"],", + "git_blob_oid": "62fe3db04b22501b703e5836174652aaddf702c3" + }, + { + "path": "scripts/relationship/placement_risk_preview_service.gd", + "sha256": "d8e974487b75fbad49ecbbe1da8e36aac23dc4e1a5cf10281a1c567c97dd59f6", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 619, + 640 + ], + "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", + "git_blob_oid": "62fe3db04b22501b703e5836174652aaddf702c3" + } + ] }, { "id": "zero_break", @@ -214,10 +279,47 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing; see legacy_evidence", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", - "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" + "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "path": "scripts/relationship/relationship_service.gd", + "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 264, + 312 + ], + "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})", + "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a" + }, + { + "path": "autoload/simulation_runtime.gd", + "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 6850, + 6850 + ], + "text": "\tvar result := relationship_service.apply_shield_attack(", + "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460" + }, + { + "path": "scripts/events/event_service.gd", + "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 1039, + 1039 + ], + "text": "\t\t\tresult = _relationship_service.apply_shield_attack(", + "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a" + } + ] }, { "id": "contact_after_break", @@ -231,7 +333,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -248,10 +350,58 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing; see legacy_evidence", "owner": "P18-03", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", - "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" + "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "path": "scripts/relationship/relationship_service.gd", + "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 315, + 340 + ], + "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})", + "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a" + }, + { + "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" + }, + { + "path": "autoload/simulation_runtime.gd", + "sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 342, + 343 + ], + "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\"))", + "git_blob_oid": "64e1d61bf2cd0acf9466605a318f7a362c793460" + }, + { + "path": "scripts/events/event_service.gd", + "sha256": "d58c416d7a1126b36023fa6ba9f02338678bd54426a3b5d04ce511d9a48c0103", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 1047, + 1047 + ], + "text": "\t\t\tresult = _relationship_service.request_route_lock(", + "git_blob_oid": "fb70350050e8cbb3f22507057137b8b8d4c1373a" + } + ] }, { "id": "duel_types", @@ -265,7 +415,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -282,7 +432,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -299,7 +449,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -316,10 +466,25 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing; see legacy_evidence", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", - "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" + "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。 P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "path": "scripts/relationship/relationship_service.gd", + "sha256": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3", + "anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", + "lines": [ + 246, + 261 + ], + "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})", + "git_blob_oid": "ba632c34d2a3fe5ebcb742746d3bbf54e06e383a" + } + ] }, { "id": "ntr_actions", @@ -333,7 +498,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -350,7 +515,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -367,7 +532,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -384,7 +549,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -401,7 +566,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -418,7 +583,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-01", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -435,7 +600,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。", "gap": "欠損: 原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。" @@ -466,7 +631,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -504,7 +669,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -537,7 +702,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -570,7 +735,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -587,7 +752,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "anri_love_interruption_cancellation", @@ -601,7 +768,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -614,7 +781,42 @@ "text": " * **アンリ (女将):** [看板娘の微笑] 配置フロアの全施設売上+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -632,7 +834,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -665,7 +867,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -697,7 +899,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -738,7 +940,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -776,7 +978,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -809,7 +1011,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -842,7 +1044,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -859,7 +1061,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "anri_ntr_interruption_cancellation", @@ -873,7 +1077,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -886,7 +1090,42 @@ "text": " * **アンリ (女将):** [看板娘の微笑] 配置フロアの全施設売上+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -904,7 +1143,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -937,7 +1176,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -969,7 +1208,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1010,7 +1249,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1048,7 +1287,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1081,7 +1320,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1114,7 +1353,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1131,7 +1370,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "anri_corruption_interruption_cancellation", @@ -1145,7 +1386,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1158,7 +1399,42 @@ "text": " * **アンリ (女将):** [看板娘の微笑] 配置フロアの全施設売上+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -1176,7 +1452,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1209,7 +1485,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1241,7 +1517,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1282,7 +1558,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1320,7 +1596,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1353,7 +1629,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1386,7 +1662,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1403,7 +1679,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "fine_love_interruption_cancellation", @@ -1417,7 +1695,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1430,7 +1708,42 @@ "text": " * **フィーネ (メイド):** [神速の奉仕] 清掃速度3倍。暗殺確率UP。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -1448,7 +1761,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1481,7 +1794,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1513,7 +1826,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1554,7 +1867,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1592,7 +1905,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1625,7 +1938,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1658,7 +1971,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1675,7 +1988,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "fine_ntr_interruption_cancellation", @@ -1689,7 +2004,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1702,7 +2017,42 @@ "text": " * **フィーネ (メイド):** [神速の奉仕] 清掃速度3倍。暗殺確率UP。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -1720,7 +2070,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1753,7 +2103,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1785,7 +2135,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1826,7 +2176,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1864,7 +2214,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1897,7 +2247,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1930,7 +2280,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1947,7 +2297,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "fine_corruption_interruption_cancellation", @@ -1961,7 +2313,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -1974,7 +2326,42 @@ "text": " * **フィーネ (メイド):** [神速の奉仕] 清掃速度3倍。暗殺確率UP。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -1992,7 +2379,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2025,7 +2412,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2057,7 +2444,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2098,7 +2485,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2136,7 +2523,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2169,7 +2556,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2202,7 +2589,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2219,7 +2606,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "tomari_love_interruption_cancellation", @@ -2233,7 +2622,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2246,7 +2635,42 @@ "text": " * **トマリ (騎士):** [鉄壁の守護] フロアトラブル0%。防衛スコア加算。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -2264,7 +2688,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2297,7 +2721,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2329,7 +2753,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2370,7 +2794,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2408,7 +2832,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2441,7 +2865,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2474,7 +2898,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2491,7 +2915,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "tomari_ntr_interruption_cancellation", @@ -2505,7 +2931,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2518,7 +2944,42 @@ "text": " * **トマリ (騎士):** [鉄壁の守護] フロアトラブル0%。防衛スコア加算。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -2536,7 +2997,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2569,7 +3030,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2601,7 +3062,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2642,7 +3103,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2680,7 +3141,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2713,7 +3174,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2746,7 +3207,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2763,7 +3224,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "tomari_corruption_interruption_cancellation", @@ -2777,7 +3240,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2790,7 +3253,42 @@ "text": " * **トマリ (騎士):** [鉄壁の守護] フロアトラブル0%。防衛スコア加算。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -2808,7 +3306,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2841,7 +3339,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2873,7 +3371,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2914,7 +3412,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2952,7 +3450,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -2985,7 +3483,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3018,7 +3516,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3035,7 +3533,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "amelia_love_interruption_cancellation", @@ -3049,7 +3549,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3062,7 +3562,42 @@ "text": " * **アメリア (シスター):** [聖なる寄付] 寄付金3倍。回復速度2倍。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -3080,7 +3615,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3113,7 +3648,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3145,7 +3680,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3186,7 +3721,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3224,7 +3759,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3257,7 +3792,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3290,7 +3825,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3307,7 +3842,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "amelia_ntr_interruption_cancellation", @@ -3321,7 +3858,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3334,7 +3871,42 @@ "text": " * **アメリア (シスター):** [聖なる寄付] 寄付金3倍。回復速度2倍。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -3352,7 +3924,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3385,7 +3957,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3417,7 +3989,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3458,7 +4030,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3496,7 +4068,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3529,7 +4101,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3562,7 +4134,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3579,7 +4151,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "amelia_corruption_interruption_cancellation", @@ -3593,7 +4167,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3606,7 +4180,42 @@ "text": " * **アメリア (シスター):** [聖なる寄付] 寄付金3倍。回復速度2倍。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -3624,7 +4233,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3657,7 +4266,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3689,7 +4298,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3730,7 +4339,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3768,7 +4377,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3801,7 +4410,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3834,7 +4443,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3851,7 +4460,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "liz_love_interruption_cancellation", @@ -3865,7 +4476,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3878,7 +4489,42 @@ "text": " * **リズ (狩人):** [エルフの眼] レア素材発見率UP。高級食材消費減。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -3896,7 +4542,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3929,7 +4575,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -3961,7 +4607,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4002,7 +4648,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4040,7 +4686,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4073,7 +4719,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4106,7 +4752,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4123,7 +4769,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "liz_ntr_interruption_cancellation", @@ -4137,7 +4785,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4150,7 +4798,42 @@ "text": " * **リズ (狩人):** [エルフの眼] レア素材発見率UP。高級食材消費減。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -4168,7 +4851,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4201,7 +4884,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4233,7 +4916,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4274,7 +4957,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4312,7 +4995,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4345,7 +5028,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4378,7 +5061,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4395,7 +5078,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "liz_corruption_interruption_cancellation", @@ -4409,7 +5094,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4422,7 +5107,42 @@ "text": " * **リズ (狩人):** [エルフの眼] レア素材発見率UP。高級食材消費減。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -4440,7 +5160,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4473,7 +5193,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4505,7 +5225,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4546,7 +5266,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4584,7 +5304,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4617,7 +5337,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4650,7 +5370,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4667,7 +5387,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "mimi_love_interruption_cancellation", @@ -4681,7 +5403,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4694,7 +5416,42 @@ "text": " * **ミミ (商人):** [商魂たくましい] 仕入れ-20%、売却+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -4712,7 +5469,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4745,7 +5502,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4777,7 +5534,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4818,7 +5575,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4856,7 +5613,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4889,7 +5646,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4922,7 +5679,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4939,7 +5696,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "mimi_ntr_interruption_cancellation", @@ -4953,7 +5712,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -4966,7 +5725,42 @@ "text": " * **ミミ (商人):** [商魂たくましい] 仕入れ-20%、売却+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -4984,7 +5778,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5017,7 +5811,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5049,7 +5843,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5090,7 +5884,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5128,7 +5922,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5161,7 +5955,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5194,7 +5988,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5211,7 +6005,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "mimi_corruption_interruption_cancellation", @@ -5225,7 +6021,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5238,7 +6034,42 @@ "text": " * **ミミ (商人):** [商魂たくましい] 仕入れ-20%、売却+20%。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -5256,7 +6087,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5289,7 +6120,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5321,7 +6152,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5362,7 +6193,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5400,7 +6231,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5433,7 +6264,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5466,7 +6297,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5483,7 +6314,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "satsuki_love_interruption_cancellation", @@ -5497,7 +6330,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5510,7 +6343,42 @@ "text": " * **サツキ (雑用):** [高貴なオーラ] VIP客満足度上昇1.5倍。チップ増。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -5528,7 +6396,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5561,7 +6429,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5593,7 +6461,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5634,7 +6502,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5672,7 +6540,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5705,7 +6573,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5738,7 +6606,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5755,7 +6623,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "satsuki_ntr_interruption_cancellation", @@ -5769,7 +6639,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5782,7 +6652,42 @@ "text": " * **サツキ (雑用):** [高貴なオーラ] VIP客満足度上昇1.5倍。チップ増。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -5800,7 +6705,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5833,7 +6738,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5865,7 +6770,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5906,7 +6811,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5944,7 +6849,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P18-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -5977,7 +6882,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-01", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -6010,7 +6915,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P26-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -6027,7 +6932,9 @@ }, "interruption_cancellation": { "common_rule_refs": [ - "departure" + "departure", + "threshold_route_loss", + "duel_loss" ], "character_specific": { "id": "satsuki_corruption_interruption_cancellation", @@ -6041,7 +6948,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -6054,7 +6961,42 @@ "text": " * **サツキ (雑用):** [高貴なオーラ] VIP客満足度上昇1.5倍。チップ増。", "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" } - } + }, + "route_termination_authorities": [ + { + "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_classification": "legacy_not_original", + "legacy_reason": "P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.", + "legacy_evidence": [ + { + "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": { "common_rule_refs": [ @@ -6072,7 +7014,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -6105,7 +7047,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P19-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", @@ -6137,7 +7079,7 @@ "baseline_sha256": "75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a" }, "status": "missing", - "implementation": "not implemented", + "implementation": "original conformance missing", "owner": "P20-02", "observation": "原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", "gap": "欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。", diff --git a/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.md b/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.md index aa29d36..bb8d355 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.md +++ b/docs/plans/original-completion-2026-10-02/execution/p19-03/REACHABILITY_TABLE.md @@ -100,7 +100,7 @@ Runtimeは登録済み人物・相互対応を検証。既存カタログのヒ ### legacy_event_ui -partial / owner: P19-01 +missing / owner: P19-01 既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。 @@ -113,7 +113,11 @@ partial / owner: P19-01 * **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。 ``` -実装証拠: {"anchor": "1b07b87d3736e777932315a4bdde8b70cbf9cb23", "lines": [89, 101], "path": "scenes/main/main.gd", "sha256": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a", "text": "\t&\"NOT_UNDERGROUND\": \"地下のマスだけ掘削できます\",\n\t&\"ALREADY_EXCAVATED\": \"すでに掘削済みです\",\n\t&\"ALREADY_RESERVED\": \"このマスは掘削中です\",\n\t&\"NO_EXCAVATED_NEIGHBOR\": \"掘削済みの隣接マスから延ばしてください\",\n\t&\"NO_ENTRANCE_CONNECTION\": \"地上入口までつながる経路がありません\",\n\t&\"SUPPORT_REQUIRED\": \"硬い地盤を支える補強施設が必要です\",\n\t&\"INSUFFICIENT_RESOURCES\": \"掘削資源が不足しています\",\n\t&\"MISSING_DEPENDENCY\": \"掘削システムを利用できません\",\n}\nconst EVENT_CHOICE_NAMES := {\n\t&\"event.relationship.threshold.acknowledge\": \"向き合う\",\n\t&\"event.relationship.threshold.defer\": \"今は保留する\",\n}"} +実装証拠: "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 @@ -127,7 +131,7 @@ missing / owner: P18-02 * **淫乱度 (Lust):** 快楽への依存。盾の防御力(ダメージ軽減率)を下げる。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### post_break_metric @@ -142,7 +146,7 @@ missing / owner: P18-02 * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### barrier_block @@ -156,7 +160,7 @@ missing / owner: P18-02 * **『愛の盾』:** NTR攻撃を無効化するバリア。耐久値0でブレイクし、NTR侵食が始まる。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### coassignment_attack @@ -170,7 +174,11 @@ missing / owner: P18-02 1. **盾への攻撃:** ライバルと同配置時、盾耐久値が減少。 ``` -実装証拠: "not implemented" +実装証拠: "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 @@ -184,7 +192,11 @@ missing / owner: P18-02 2. **ブレイク:** 耐久値0で「心の隙間」発生。 ``` -実装証拠: "not implemented" +実装証拠: "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 @@ -198,7 +210,7 @@ missing / owner: P18-02 3. **NTR進行:** ライバル接触で直接NTR度が上昇。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### threshold_route_loss @@ -212,7 +224,11 @@ missing / owner: P18-03 4. **陥落確定:** NTR度が閾値越えで盾が消滅。純愛ルート完全消失。 ``` -実装証拠: "not implemented" +実装証拠: "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 @@ -227,7 +243,7 @@ NTR阻止のための直接的解決手段。 * **種類:** 武力決闘、商談決闘、夜の決闘(性技対決)。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### duel_win @@ -241,7 +257,7 @@ missing / owner: P19-01 * **リターン:** ライバル追放・隷属化、「愛の盾」全回復。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### duel_loss @@ -255,7 +271,7 @@ missing / owner: P19-01 * **リスク:** 敗北時、ヒロインを即座に強奪されNTRルート確定。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### love_actions @@ -269,7 +285,11 @@ missing / owner: P19-01 * **純愛:** デート・会話で盾を回復。ライバルを物理的に隔離、または決闘で排除。 ``` -実装証拠: "not implemented" +実装証拠: "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 @@ -283,7 +303,7 @@ missing / owner: P19-01 * **NTR:** 意図的に放置・アングラ労働で盾を弱体化させ、覗き部屋から寝取られる過程を鑑賞する。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### corruption_actions @@ -297,7 +317,7 @@ missing / owner: P19-01 * **堕落:** 媚薬や地下業務で淫乱度を上げ、盾の耐久値上限を溶かして家畜化させる。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### history_fields @@ -311,7 +331,7 @@ missing / owner: P19-02 * **履歴:** 処女喪失相手、経験数、現在のパートナーを記録。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### history_cycle_parentage @@ -325,7 +345,7 @@ missing / owner: P19-02 * **妊娠:** 排卵日あり。父親判定、妊婦期の外見・ステータス変化。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### portrait_marks @@ -339,7 +359,7 @@ missing / owner: P26-02 * **刻印:** 指輪(純愛)、キスマーク(NTR)、淫紋・首輪・焼印(堕落・家畜)が立ち絵に反映される。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### route_skills @@ -353,7 +373,7 @@ missing / owner: P20-01 * **ルート変化:** 純愛/堕落などの進行度で習得するスキルが変化する。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ### departure @@ -367,7 +387,7 @@ missing / owner: P19-02 * **離脱:** 原則ロストしないが、防衛戦敗北での一時拉致や、特定バッドエンド確定時にのみ敵や背景オブジェクト化する。 ``` -実装証拠: "not implemented" +実装証拠: "original conformance missing" ## anri / アンリ / 純愛 @@ -375,7 +395,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -386,7 +408,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -397,7 +421,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -408,7 +434,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -419,7 +447,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -430,7 +460,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -441,7 +473,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -452,7 +486,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -463,7 +499,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -474,7 +512,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -485,7 +525,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -496,7 +538,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -507,7 +551,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -518,7 +564,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -529,7 +577,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -540,7 +590,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -551,7 +603,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -562,7 +616,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -573,7 +629,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -584,7 +642,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] @@ -595,7 +655,9 @@ missing / owner: P19-02 - 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] / missing / 欠損: 原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。 / owner: P19-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] diff --git a/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py b/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py index 08d1535..53cc09a 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py +++ b/docs/plans/original-completion-2026-10-02/execution/p19-03/check_reachability_table.py @@ -13,7 +13,10 @@ BASELINE = 'docs/traceability/original/BASELINE.txt' ANCHOR = '1b07b87d3736e777932315a4bdde8b70cbf9cb23' BASE = '8ca9263fee1ec4374d97c01fda82b95e1df6a977' BASE_HASH = '75e4bdbdeb379c9269553f0c776bdb9cc96e01f2d6aa5ca650d132c63a8aeb1a' -SPEC_HASH = '263a01b943d8056727335fb76977c010298e1c229077f8da76e48683ba2e89bb' +SPEC_FILE_BYTES_SHA256 = '263a01b943d8056727335fb76977c010298e1c229077f8da76e48683ba2e89bb' +# Proof: build/owner-handoff/p19-review-r01/SPEC_HASH_REPRESENTATIONS.json +# Both hashes describe the same unchanged TASK_SPEC.json. +RUNNER_CONTRACT_SPEC_SHA256 = '3af3d9b931edc5449796662ad69bb6f67c80b48827a86565b1952931db68dd15' PINS_HASH = '6c778226a4cc6d0b0d682500759e7d4229c926a27bd2e247b00b9c3e5f1a2fb0' ROUTES = {'love': '純愛', 'ntr': 'NTR', 'corruption': '堕落'} PEOPLE = [('anri', 'アンリ'), ('fine', 'フィーネ'), ('tomari', 'トマリ'), @@ -26,6 +29,36 @@ SERVICE = 'scripts/relationship/relationship_service.gd' RUNTIME = 'autoload/simulation_runtime.gd' CATALOG = 'data/characters/mvp_unique_characters.json' +EVENT = 'scripts/events/event_service.gd' +PREVIEW = 'scripts/relationship/placement_risk_preview_service.gd' +LEGACY_REASON = 'P18-01 forbids one-to-one conversion; legacy numbers/daily limits are not approved originals.' +LEGACY_RANGES = { + 'coassignment_attack': [(SERVICE,264,312),(RUNTIME,6850,6850),(EVENT,1039,1039),(PREVIEW,536,565),(PREVIEW,619,640)], + 'zero_break': [(SERVICE,264,312),(RUNTIME,6850,6850),(EVENT,1039,1039)], + 'love_actions': [(SERVICE,246,261)], + 'threshold_route_loss': [(SERVICE,315,340),(SERVICE,343,355),(RUNTIME,342,343),(EVENT,1047,1047)], + 'legacy_event_ui': [('scenes/main/main.gd',98,101)], +} + + +def validate_legacy(root, document): + rules = {r['id']: r for r in document['common_rules']} + for identity, ranges in LEGACY_RANGES.items(): + rule = rules[identity] + require(rule['status'] == 'missing' and rule['legacy_classification'] == 'legacy_not_original', + 'legacy/original classification') + require(rule['implementation'] == 'original conformance missing; see legacy_evidence' + and rule['legacy_reason'] == LEGACY_REASON, 'unqualified legacy absence') + entries = rule.get('legacy_evidence') + require(type(entries) is list and len(entries) == len(ranges), 'missing legacy evidence') + for entry, (path, start, end) in zip(entries, ranges): + data = blob(root, ANCHOR, path) + oid = subprocess.check_output(['git','rev-parse',ANCHOR+':'+path],cwd=root).decode().strip() + require(entry == {'path':path,'anchor':ANCHOR,'git_blob_oid':oid, + 'sha256':sha(data),'lines':[start,end], + 'text':'\n'.join(data.decode().splitlines()[start-1:end])}, 'legacy text/blob/range') + require(data == (root/path).read_bytes(), 'legacy current source mismatch') + def sha(data): return hashlib.sha256(data).hexdigest() @@ -63,7 +96,7 @@ def selection(root): def binding(root): raw = lambda p: (root / p).read_bytes() - require(sha(raw(OUT + 'TASK_SPEC.json')) == SPEC_HASH, 'immutable spec changed') + require(sha(raw(OUT + 'TASK_SPEC.json')) == SPEC_FILE_BYTES_SHA256, 'immutable spec changed') spec = decode(raw(OUT + 'TASK_SPEC.json')) require(sha(raw(OUT + 'FROZEN_GAME_INPUT_PINS.json')) == spec['frozen_game_input_pins_sha256'] == PINS_HASH, 'frozen pins SHA differs from immutable spec') @@ -86,7 +119,9 @@ def binding(root): require(raw(p) == blob(root, ANCHOR, p), 'stale audited source: ' + p) return {'actual_commit': subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=root).decode().strip(), 'selected_files': len(actual), 'anchor': ANCHOR, 'file_equality': True, - 'native_evidence_reuse_accepted': False} + 'native_evidence_reuse_accepted': False, + 'TASK_SPEC_file_bytes_sha256': SPEC_FILE_BYTES_SHA256, + 'Runner_git_show_stripped_UTF8_contract_spec_sha256': RUNNER_CONTRACT_SPEC_SHA256} def expected(root): @@ -108,7 +143,7 @@ def expected(root): 'lines': [start, end], 'text': '\n'.join(data.decode().splitlines()[start - 1:end])} def item(identity, start, end, note, owner, status='missing', source=None): return {'id': identity, 'authority': cite(start, end), 'status': status, - 'implementation': source or 'not implemented', 'owner': owner, + 'implementation': source or 'original conformance missing', 'owner': owner, 'observation': note, 'gap': None if status == 'implemented' else '欠損: ' + note} # Only narrow storage facts are implemented; simulation/route completion never follows. rules = [ @@ -121,7 +156,7 @@ def expected(root): item('identity_registration', 138, 138, 'Runtimeは登録済み人物・相互対応を検証。既存カタログのヒロインはアンリのみ。通常ルート入口ではない。', 'P19-01', 'partial', evidence(RUNTIME, 6791, 6812)), item('legacy_event_ui', 154, 157, '既存UIには汎用関係イベントの確認/保留ラベルがある。原本の行動・決闘選択・自然ルート到達は欠損。', - 'P19-01', 'partial', evidence('scenes/main/main.gd', 89, 101)), + 'P19-01', 'partial', evidence('scenes/main/main.gd', 98, 101)), ] clauses = [ ('defense_reduction', 141, 141, 'P18-02'), ('post_break_metric', 142, 143, 'P18-02'), @@ -136,6 +171,17 @@ def expected(root): for identity, start, end, owner in clauses: rules.append(item(identity, start, end, '原本の共通要求。専用原本モデルにはこの更新・表示の実装なし。旧汎用モデルの数値やルートを代用しない。', owner)) + for rule in rules: + if rule['id'] in LEGACY_RANGES: + rule.update(status='missing', implementation='original conformance missing; see legacy_evidence', + legacy_classification='legacy_not_original', legacy_reason=LEGACY_REASON) + rule['gap'] = '欠損: ' + rule['observation'] + ' ' + LEGACY_REASON + rule['legacy_evidence'] = [] + for path, start, end in LEGACY_RANGES[rule['id']]: + entry = evidence(path, start, end) + entry['git_blob_oid'] = subprocess.check_output( + ['git','rev-parse',ANCHOR+':'+path],cwd=root).decode().strip() + rule['legacy_evidence'].append(entry) # Read complete selected atomic records, not only their condition strings. atoms = decode(raw(PLAN + 'atomic_requirements.json'))['requirements'] atoms = [x for x in atoms if set(x.get('source_group_ids', [])) & {'B-7.' + str(i) for i in range(1, 7)}] @@ -156,7 +202,7 @@ def expected(root): 'post_break_metric', 'barrier_block', 'coassignment_attack', 'zero_break', 'contact_after_break'], 'duel_effects': ['duel_types', 'duel_win', 'duel_loss'], 'route_selection_effects': ['threshold_route_loss', route + '_actions', 'route_skills'], - 'interruption_cancellation': ['departure'], 'save_handling': ['snapshot_container'], + 'interruption_cancellation': ['departure', 'threshold_route_loss', 'duel_loss'], 'save_handling': ['snapshot_container'], 'history_marks': ['history_fields', 'history_cycle_parentage', 'portrait_marks'], 'current_reachability': ['identity_registration', 'threshold_route_loss']} categories = {} @@ -169,6 +215,12 @@ def expected(root): '原本未定義/D08 pending: 人物固有のイベント列・条件・中断取消・進行保存・履歴と通常到達は未制作/未証明。共通要求から固有仕様を創作しない。', owner) gap['character_authority'] = cite(118 + i) categories[category] = {'common_rule_refs': refs[category], 'character_specific': gap} + if category == 'interruption_cancellation': + categories[category].update(route_termination_authorities=[cite(148),cite(153)], + legacy_classification='legacy_not_original', legacy_reason=LEGACY_REASON, + legacy_evidence=[e for r in rules if r['id']=='threshold_route_loss' + for e in r['legacy_evidence'] if e['path']==SERVICE and e['lines']==[343,355]]) + cells.append({'character_id': key, 'name': name, 'route_id': route, 'route': route_name, 'natural_route_complete': False, 'categories': categories}) return {'task_id': 'P19-03-TABLE', 'schema_version': 1, @@ -190,8 +242,10 @@ def expected(root): 'accounting': '14/88 unchanged; formal Runner validation, independent whole-unit Opus review and normal integration/final required; no game acceptance'} -def verify(candidate, canonical): +def verify(candidate, canonical, root=None): require(type(candidate) is dict, 'document must be an object') + if root is not None: + validate_legacy(root, candidate) # Exact canonical equality also rejects additions, type coercion, invented numbers, # owner/status promotion and unsupported completion, including nested metadata. require(json.dumps(candidate, ensure_ascii=False, sort_keys=True) == @@ -215,6 +269,10 @@ def markdown(d): r['observation'], '', '原本 %s:%s–%s' % (BASELINE, *r['authority']['lines']), '', '```text', r['authority']['text'], '```', '', '実装証拠: ' + json.dumps(r['implementation'], ensure_ascii=False, sort_keys=True), ''] + if 'legacy_evidence' in r: + lines += ['旧実装: ' + r['legacy_classification'] + ' / ' + r['legacy_reason'], '', + '旧証拠 (git_blob_oid: Git blob OID; sha256: file-bytes SHA-256): ' + + json.dumps(r['legacy_evidence'], ensure_ascii=False, sort_keys=True), ''] for c in d['cells']: lines += ['## ' + c['character_id'] + ' / ' + c['name'] + ' / ' + c['route'], ''] for category, record in c['categories'].items(): @@ -222,6 +280,9 @@ def markdown(d): lines += ['- ' + category + ': 共通 [' + ', '.join(record['common_rule_refs']) + '] / missing / ' + g['gap'] + ' / owner: ' + g['owner'] + ' / 原本 ' + str(g['authority']['lines']) + '・人物 ' + str(g['character_authority']['lines'])] + if category == 'interruption_cancellation': + lines += [' 原本中断参照: ' + json.dumps(record['route_termination_authorities'], ensure_ascii=False), + ' 旧確定ロック legacy_not_original: ' + json.dumps(record['legacy_evidence'], ensure_ascii=False)] lines.append('') lines += ['## ルート別適用性', ''] for route, support in d['route_support'].items(): @@ -245,10 +306,12 @@ def main(): result = binding(root) if not args.source_binding_only: canonical = expected(root) + validate_legacy(root, canonical) if args.write: (root / OUT / 'REACHABILITY_TABLE.json').write_text(json.dumps(canonical, ensure_ascii=False, indent=2) + '\n', encoding='utf-8') (root / OUT / 'REACHABILITY_TABLE.md').write_text(markdown(canonical), encoding='utf-8') else: + validate_legacy(root, decode((root / OUT / 'REACHABILITY_TABLE.json').read_bytes())) verify_records(decode((root / OUT / 'REACHABILITY_TABLE.json').read_bytes()), canonical, (root / OUT / 'REACHABILITY_TABLE.md').read_bytes()) print(json.dumps({'audit_integrity': 'pass', 'formal_acceptance': 'pending_runner_and_independent_review', **result})) diff --git a/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py b/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py index 244aa65..05d84d8 100644 --- a/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py +++ b/docs/plans/original-completion-2026-10-02/execution/p19-03/test_reachability_table.py @@ -29,6 +29,39 @@ class AuditTests(unittest.TestCase): self.assertEqual({r['status'] for r in value['common_rules']}, {'implemented', 'partial', 'missing'}) audit.verify(value, self.canonical) + def test_independent_legacy_source_evidence(self): + import subprocess + document = audit.decode((ROOT / audit.OUT / 'REACHABILITY_TABLE.json').read_bytes()) + audit.validate_legacy(ROOT, document) + for rule in document['common_rules']: + for entry in rule.get('legacy_evidence', []): + data = subprocess.check_output(['git', 'show', audit.ANCHOR + ':' + entry['path']], cwd=ROOT) + self.assertEqual(data, (ROOT / entry['path']).read_bytes()) + self.assertEqual(entry['git_blob_oid'], subprocess.check_output( + ['git','hash-object','--stdin'], input=data, cwd=ROOT).decode().strip()) + start, end = entry['lines'] + self.assertEqual(entry['text'], '\n'.join(data.decode().splitlines()[start-1:end])) + rules = {r['id']: r for r in document['common_rules']} + self.assertIn('func restore_shield', rules['love_actions']['legacy_evidence'][0]['text']) + self.assertIn('shield_broken', rules['zero_break']['legacy_evidence'][0]['text']) + self.assertIn('EXCLUSIVE_LOCKED', rules['threshold_route_loss']['legacy_evidence'][1]['text']) + + def test_legacy_evidence_required_independently(self): + for identity in audit.LEGACY_RANGES: + for mutation in ('drop', 'empty', 'absence', 'blob', 'text'): + changed = copy.deepcopy(self.canonical) + rule = next(r for r in changed['common_rules'] if r['id'] == identity) + if mutation == 'drop': + rule.pop('legacy_evidence') + elif mutation == 'empty': + rule['legacy_evidence'] = [] + elif mutation == 'absence': + rule['implementation'] = 'not implemented' + else: + rule['legacy_evidence'][0]['git_blob_oid' if mutation == 'blob' else 'text'] = 'stale' + with self.subTest(identity=identity, mutation=mutation), self.assertRaises(ValueError): + audit.validate_legacy(ROOT, changed) + def test_exact_cell_product(self): mutations = { 'missing': lambda d: d['cells'].pop(),