Preserve reviewed input-copy candidate and reconcile P23-02 acceptance ledger

This commit is contained in:
Takeshi
2026-10-12 13:48:14 +09:00
parent 083dbe8d02
commit ce36e98dde
165 changed files with 9933 additions and 123 deletions
@@ -1,5 +1,12 @@
# 原本全実装に向けた作業計画 2026年10月改訂
## P23-02 現着手・次に閉じる1件(r337、2026-10-12)
P23-02着手中。制作r32と選定済み実装親r274/library275は保持。最新未選定・未採用候補r333/library334は、親r326の在庫入力キー整列と経路コピーだけをnative化。未捕捉std確保例外をビルド前に修復。bridge1/link1、SDKcompile0、既存stage再利用。局所4工程404/0、Runtime150候補105808bytes・評価後11411840bytes原golden全文一致。S6 24/0、両whole15/0、after647全11487732bytes原oracle全文一致を独立有限受理。単一隣接観測1037100→1010883us(約2.5279%短縮)だが約1.01秒停止が残り安定性能・50ms/P95/D10は未受入。r204再構築は既非採用のため再実装なし。原9横断8はすべて未受入、Windows C08/X8のみblock、手動Ctrl保持wheel/左ボタン保持dragは延期・未達・非免除。正式9/着手19/予定60、30パッケージ/88成果、部分点なし、今回正式完了追加0。
全17条件・対象版・不足条件の現在authorityは `artifacts/original-completion-2026-10-02/p23-02-current-progress-disposition-r337.json`。詳細と保存証拠は `execution/CURRENT_NATIVE_INPUT_COPY_R332_R337.md`。依存P08/P22。過去の候補版に関する後続記載は履歴であり、最新対象版の受入証拠へ無条件転用しない。
## P23-02 現着手・次に閉じる1件(2026-10-12・r318証拠統合)
P23-02断面操作性は着手中・次に閉じる1件。30パッケージ/88成果、正式9/着手19/予定60、部分点なし。原17条件C01-C09/X1-X8は未受入、Windows C08/X8だけブロック。制作r32と実装親r274/library275を保持、r302/library303は未採用・選定保留。Guest一括候補r313-r02/library314-r02も隔離未採用・未選定。r315はliteral原Guestのclass_nameだけ除去した独立oracleとの局所53記録、原S3の18メソッド、692/0、全606268bytesの独立decode/roundtrip・型付き156比較を有限受理。pureのaccepted/rejected/ranked、4decisionと7fallbackの全状態・callback/通知順・所有を比較した。raw ordered fieldの直接oracle比較と任意custom override/一般再入は未認定。r317は候補原S6 24/0とbaseline whole15/0・全11487732bytes原oracle一致後、driverの空AssertionErrorで停止。原因は未特定、candidate未実行・pair不成立、所有2PID終了/全復元を確認。r317-r02のラベル追加による容量条件脱落と旧engine3件数を事前拒否・engine0で保存。r317-r03は容量条件とengine1件数へ修復し成功済phaseを再利用し候補whole1engineだけ続行、15/0・全11487732bytes原oracle一致・strict/private/所有終了/両stage復元を有限受理。同期時間1090007usは候補単発観測のみ、隣接pair/安定利益/50ms/P95/D10を認定しない。build/library複製/stageclone/全172追加0。旧詳細と版付き証拠はr316 matrixとcheckpointを保持。正式完了追加0。次は同候補の代表負荷時間を基に、50ms未達を解消する必要な関連変更をまとめる。正確な最終版で必須全172、P95/D10、通常OS/x3/終了/小画面、同一Windows配布版実機と原17条件を受入する。手動入力2件は延期・未達・免除なし。
@@ -1,5 +1,12 @@
# P00〜P03 進捗台帳への証拠統合
## P23-02 現着手・次に閉じる1件(r337、2026-10-12)
P23-02着手中。制作r32と選定済み実装親r274/library275は保持。最新未選定・未採用候補r333/library334は、親r326の在庫入力キー整列と経路コピーだけをnative化。未捕捉std確保例外をビルド前に修復。bridge1/link1、SDKcompile0、既存stage再利用。局所4工程404/0、Runtime150候補105808bytes・評価後11411840bytes原golden全文一致。S6 24/0、両whole15/0、after647全11487732bytes原oracle全文一致を独立有限受理。単一隣接観測1037100→1010883us(約2.5279%短縮)だが約1.01秒停止が残り安定性能・50ms/P95/D10は未受入。r204再構築は既非採用のため再実装なし。原9横断8はすべて未受入、Windows C08/X8のみblock、手動Ctrl保持wheel/左ボタン保持dragは延期・未達・非免除。正式9/着手19/予定60、30パッケージ/88成果、部分点なし、今回正式完了追加0。
全17条件・対象版・不足条件の現在authorityは `artifacts/original-completion-2026-10-02/p23-02-current-progress-disposition-r337.json`。詳細と保存証拠は `execution/CURRENT_NATIVE_INPUT_COPY_R332_R337.md`。依存P08/P22。過去の候補版に関する後続記載は履歴であり、最新対象版の受入証拠へ無条件転用しない。
## P23-02 現着手・次に閉じる1件(2026-10-12・r318証拠統合)
P23-02断面操作性は着手中・次に閉じる1件。30パッケージ/88成果、正式9/着手19/予定60、部分点なし。原17条件C01-C09/X1-X8は未受入、Windows C08/X8だけブロック。制作r32と実装親r274/library275を保持、r302/library303は未採用・選定保留。Guest一括候補r313-r02/library314-r02も隔離未採用・未選定。r315はliteral原Guestのclass_nameだけ除去した独立oracleとの局所53記録、原S3の18メソッド、692/0、全606268bytesの独立decode/roundtrip・型付き156比較を有限受理。pureのaccepted/rejected/ranked、4decisionと7fallbackの全状態・callback/通知順・所有を比較した。raw ordered fieldの直接oracle比較と任意custom override/一般再入は未認定。r317は候補原S6 24/0とbaseline whole15/0・全11487732bytes原oracle一致後、driverの空AssertionErrorで停止。原因は未特定、candidate未実行・pair不成立、所有2PID終了/全復元を確認。r317-r02のラベル追加による容量条件脱落と旧engine3件数を事前拒否・engine0で保存。r317-r03は容量条件とengine1件数へ修復し成功済phaseを再利用し候補whole1engineだけ続行、15/0・全11487732bytes原oracle一致・strict/private/所有終了/両stage復元を有限受理。同期時間1090007usは候補単発観測のみ、隣接pair/安定利益/50ms/P95/D10を認定しない。build/library複製/stageclone/全172追加0。旧詳細と版付き証拠はr316 matrixとcheckpointを保持。正式完了追加0。次は同候補の代表負荷時間を基に、50ms未達を解消する必要な関連変更をまとめる。正確な最終版で必須全172、P95/D10、通常OS/x3/終了/小画面、同一Windows配布版実機と原17条件を受入する。手動入力2件は延期・未達・免除なし。
@@ -0,0 +1,56 @@
{
"plan": [
[
"compile-062",
[
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"-c",
"-std=c++17",
"-isystem",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
"-isystem",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
"-Wall",
"-Wextra",
"-Werror",
"-fexceptions",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-O3",
"-fPIC",
"-DMACOS_ENABLED",
"-DUNIX_ENABLED",
"-DTHREADS_ENABLED",
"-DDEBUG_ENABLED",
"-DNDEBUG",
"-DGDEXTENSION",
"-I/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
]
],
[
"link",
[
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-Wl,-S",
"-Wl,-x",
"-Wl,-dead_strip",
"-shared",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
]
]
]
}
@@ -0,0 +1,49 @@
{
"pid": 47216,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"-c",
"-std=c++17",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
"-Wall",
"-Wextra",
"-Werror",
"-fexceptions",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-O3",
"-fPIC",
"-DMACOS_ENABLED",
"-DUNIX_ENABLED",
"-DTHREADS_ENABLED",
"-DDEBUG_ENABLED",
"-DNDEBUG",
"-DGDEXTENSION",
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
],
"pgid": 47216,
"ended_utc": "2026-10-12T04:27:09.188321+00:00",
"exit_code": 0,
"duration_seconds": 1.9507496249999994,
"cleanup": [
{
"attempt": 0,
"pgid": 47216,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"remaining": [],
"cleanup_errors": [],
"foreign_process_or_group_signals": 0
}
@@ -0,0 +1,45 @@
{
"pid": 47216,
"owner_pid": 47179,
"pgid": 47216,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"-c",
"-std=c++17",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
"-Wall",
"-Wextra",
"-Werror",
"-fexceptions",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-O3",
"-fPIC",
"-DMACOS_ENABLED",
"-DUNIX_ENABLED",
"-DTHREADS_ENABLED",
"-DDEBUG_ENABLED",
"-DNDEBUG",
"-DGDEXTENSION",
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
],
"started_utc": "2026-10-12T04:27:07.271137+00:00",
"initial_members": [
{
"pid": 47216,
"ppid": 47179,
"pgid": 47216,
"args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os -c -std=c++17 -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include -isystem /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include -Wall -Wextra -Werror -fexceptions -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -O3 -fPIC -DMACOS_ENABLED -DUNIX_ENABLED -DTHREADS_ENABLED -DDEBUG_ENABLED -DNDEBUG -DGDEXTENSION -I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
}
],
"owned_new_session": true
}
@@ -0,0 +1,28 @@
{
"name": "compile-062",
"result": {
"pid": 47216,
"exit_code": 0,
"timed_out": false,
"error_lines": [],
"duration_seconds": 1.9510925420000005
},
"capture": {
"passed": true,
"cleanup": [
{
"attempt": 0,
"pgid": 47216,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"cleanup_errors": [],
"all_captured_ended": true,
"foreign_process_or_group_signals": 0
},
"full_input_inventory_before_verified": true,
"full_input_inventory_after_verified": true,
"post_input_error": null
}
@@ -0,0 +1,173 @@
{
"passed": true,
"error": null,
"phases": [
{
"name": "compile-062",
"result": {
"pid": 47216,
"exit_code": 0,
"timed_out": false,
"error_lines": [],
"duration_seconds": 1.9510925420000005
},
"capture": {
"passed": true,
"cleanup": [
{
"attempt": 0,
"pgid": 47216,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"cleanup_errors": [],
"all_captured_ended": true,
"foreign_process_or_group_signals": 0
},
"full_input_inventory_before_verified": true,
"full_input_inventory_after_verified": true,
"post_input_error": null
},
{
"name": "link",
"result": {
"pid": 47241,
"exit_code": 0,
"timed_out": false,
"error_lines": [],
"duration_seconds": 0.30894625
},
"capture": {
"passed": true,
"cleanup": [
{
"attempt": 0,
"pgid": 47241,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"cleanup_errors": [],
"all_captured_ended": true,
"foreign_process_or_group_signals": 0
},
"full_input_inventory_before_verified": true,
"full_input_inventory_after_verified": true,
"post_input_error": null
}
],
"cleanup": [
[
{
"attempt": 0,
"pgid": 47216,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
[
{
"attempt": 0,
"pgid": 47241,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
]
],
"cleanup_errors": [],
"binary_checks": {
"file": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib: Mach-O 64-bit dynamically linked shared library arm64\n",
"arch": "arm64\n",
"dependencies": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib:\n\t/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib (compatibility version 0.0.0, current version 0.0.0)\n\t/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 2100.43.0)\n\t/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1356.0.0)\n",
"exports": "0000000000000828 T _tree_numeric_core_init\n"
},
"object": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"bytes": 387120,
"sha256": "34457a4ccc7746d1ed9dda2e7638eef7dc432e2e5ee13329fe1b347c8907b232"
},
"library": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
"bytes": 433744,
"sha256": "39f8ed73f077d15037d85b9cb53f38389c032a36dea7ff04348e5ef05c736907"
},
"original_inputs_preserved": true,
"bridge_compilations": 1,
"link_attempts": 1,
"spawned_children": [
{
"phase": "compile-062",
"pid": 47216,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"-c",
"-std=c++17",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/include",
"-isystem",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-candidate-r131/sdk/gen/include",
"-Wall",
"-Wextra",
"-Werror",
"-fexceptions",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-O3",
"-fPIC",
"-DMACOS_ENABLED",
"-DUNIX_ENABLED",
"-DTHREADS_ENABLED",
"-DDEBUG_ENABLED",
"-DNDEBUG",
"-DGDEXTENSION",
"-I/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp"
]
},
{
"phase": "link",
"pid": 47241,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-Wl,-S",
"-Wl,-x",
"-Wl,-dead_strip",
"-shared",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
]
}
],
"SDK_compilations": 0,
"SDK_archive_reused": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a",
"bytes": 2284912,
"sha256": "4d54f0980c3f445f3013cddb859135b619f28a91205fc8b9fbc9d10bc76c52c3"
},
"SDK_archive_rebuilt": false,
"old_bridge_object_reused": false,
"Godot_loaded": false,
"selected": false,
"unit_accepted": false,
"performance_accepted": false,
"limits": [
"Exact r333 Guest batch bridge one-object compile and link to authenticated unchanged r133 SDK archive only; no SDK recompilation, Godot load, protocol, performance or unit acceptance."
]
}
@@ -0,0 +1,35 @@
{
"pid": 47241,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-Wl,-S",
"-Wl,-x",
"-Wl,-dead_strip",
"-shared",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
],
"pgid": 47241,
"ended_utc": "2026-10-12T04:27:09.948383+00:00",
"exit_code": 0,
"duration_seconds": 0.30862637499999934,
"cleanup": [
{
"attempt": 0,
"pgid": 47241,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"remaining": [],
"cleanup_errors": [],
"foreign_process_or_group_signals": 0
}
@@ -0,0 +1,31 @@
{
"pid": 47241,
"owner_pid": 47179,
"pgid": 47241,
"argv": [
"/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++",
"-o",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib",
"-arch",
"arm64",
"-isysroot",
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk",
"-fvisibility=hidden",
"-Wl,-S",
"-Wl,-x",
"-Wl,-dead_strip",
"-shared",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
],
"started_utc": "2026-10-12T04:27:09.672403+00:00",
"initial_members": [
{
"pid": 47241,
"ppid": 47179,
"pgid": 47241,
"args": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/libtree_numeric_core.macos.template_debug.dylib -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -fvisibility=hidden -Wl,-S -Wl,-x -Wl,-dead_strip -shared /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-build-r334/objects/062-tree_numeric_core.os /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-sdk-lifetime-build-r133/libgodot-cpp.macos.template_debug.arm64.a"
}
],
"owned_new_session": true
}
@@ -0,0 +1,28 @@
{
"name": "link",
"result": {
"pid": 47241,
"exit_code": 0,
"timed_out": false,
"error_lines": [],
"duration_seconds": 0.30894625
},
"capture": {
"passed": true,
"cleanup": [
{
"attempt": 0,
"pgid": 47241,
"members_before": [],
"group_signal": null,
"tracked_parent_signal": null
}
],
"cleanup_errors": [],
"all_captured_ended": true,
"foreign_process_or_group_signals": 0
},
"full_input_inventory_before_verified": true,
"full_input_inventory_after_verified": true,
"post_input_error": null
}
@@ -0,0 +1,58 @@
{
"plan_id": "P23-02",
"status": "uncompiled_implementation_candidate",
"parent": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/input.json",
"bytes": 3185,
"sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254"
},
"contract": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-work-contract-r332.json",
"bytes": 2058,
"sha256": "33a6555addd3471f2f00f35659e3f4e69f7fa26598755f8af6b0deabbf8932c5"
},
"candidate_pins": {
"scripts/guest_service.gd": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/guest_service.gd",
"bytes": 62505,
"sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e"
},
"scripts/simulation_runtime.gd": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/simulation_runtime.gd",
"bytes": 612068,
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
},
"source/guest_candidate_batch.inc": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/guest_candidate_batch.inc",
"bytes": 28222,
"sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9"
},
"source/tree_core.hpp": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_core.hpp",
"bytes": 3467,
"sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1"
},
"source/tree_numeric_core.cpp": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp",
"bytes": 57762,
"sha256": "d948b9c2033fd9f2ad8b85a1d5ed51fd431eb78b68b3634dc020df104712ad11"
}
},
"original_method_sources": [
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/scripts/world/path_service.gd",
"bytes": 132925,
"sha256": "6b7f4e989ea9b09495f814d8ecb294028d10794005966414bf52640e122b0d17"
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/autoload/simulation_runtime.gd",
"bytes": 612068,
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
}
],
"selected": false,
"adopted": false,
"unit_accepted": false,
"performance_accepted": false,
"formal_completed_added": 0
}
@@ -0,0 +1,70 @@
{
"plan_id": "P23-02",
"status": "uncompiled_implementation_candidate",
"parent": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-hot-loop-candidate-r326/input.json",
"bytes": 3185,
"sha256": "27141ccb37a741cc468bf57cf6e5da2250b729a2fa21bbda5fa1b7f15df7b254"
},
"contract": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-work-contract-r332.json",
"bytes": 2058,
"sha256": "33a6555addd3471f2f00f35659e3f4e69f7fa26598755f8af6b0deabbf8932c5"
},
"candidate_pins": {
"scripts/guest_service.gd": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/guest_service.gd",
"bytes": 62505,
"sha256": "77ce52ebeed6a89f3e397de01572b17ea3e3cb246f7daca9145a1a192389969e"
},
"scripts/simulation_runtime.gd": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/scripts/simulation_runtime.gd",
"bytes": 612068,
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
},
"source/guest_candidate_batch.inc": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/guest_candidate_batch.inc",
"bytes": 28222,
"sha256": "3623a7ca03b96118c927662fc5a95c1f73e20251d5ef4b04ec519603c3c05ba9"
},
"source/tree_core.hpp": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_core.hpp",
"bytes": 3467,
"sha256": "5f67d85bfc91d5c7830aabd8089f4bca05883045d671d4e683d7c532cf3a34a1"
},
"source/tree_numeric_core.cpp": {
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source/tree_numeric_core.cpp",
"bytes": 58156,
"sha256": "5957fab6cdef5f44ef69cbfaa1685c5eba2aefcab7d6fb7b8bf383e54386aa01"
}
},
"original_method_sources": [
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/scripts/world/path_service.gd",
"bytes": 132925,
"sha256": "6b7f4e989ea9b09495f814d8ecb294028d10794005966414bf52640e122b0d17"
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage/autoload/simulation_runtime.gd",
"bytes": 612068,
"sha256": "7eb24adbf91fe53cde14954dda12abd5efb05130de7d356d8df281ee99065e86"
}
],
"selected": false,
"adopted": false,
"unit_accepted": false,
"performance_accepted": false,
"formal_completed_added": 0,
"precompile_allocation_guard_repair": [
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/source-before-allocation-guard.cpp",
"bytes": 57762,
"sha256": "d948b9c2033fd9f2ad8b85a1d5ed51fd431eb78b68b3634dc020df104712ad11"
},
{
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-candidate-r333/input-before-allocation-guard.json",
"bytes": 3183,
"sha256": "5004a1b7d0d250a4e32107e88673c296df9a9291ba74424d36be61a7bfa62117"
}
]
}
@@ -0,0 +1,395 @@
private:
// This scope owns names only for one call. It retains no guest, candidate,
// callback, result, cache or saved simulation state across calls.
struct GuestBatchKey {
const StringName name;
const String text;
explicit GuestBatchKey(const char *s):name(s,false),text(name) {}
};
// Immutable key objects belong to one public batch call only. No guest,
// dictionary, callback, cached value or name survives that call.
struct GuestBatchNames {
const GuestBatchKey k_empty{""};
const GuestBatchKey k_ADULT_NOT_VERIFIED{"ADULT_NOT_VERIFIED"};
const GuestBatchKey k_CANNOT_PAY{"CANNOT_PAY"};
const GuestBatchKey k_CONTENT_FILTERED{"CONTENT_FILTERED"};
const GuestBatchKey k_ETA_AFTER_EXIT{"ETA_AFTER_EXIT"};
const GuestBatchKey k_FACILITY_CLOSED{"FACILITY_CLOSED"};
const GuestBatchKey k_FORBIDDEN_GUEST_TAG{"FORBIDDEN_GUEST_TAG"};
const GuestBatchKey k_GUEST_TYPE_NOT_ALLOWED{"GUEST_TYPE_NOT_ALLOWED"};
const GuestBatchKey k_ILLEGALITY_REFUSED{"ILLEGALITY_REFUSED"};
const GuestBatchKey k_INVALID_NEED_MAP{"INVALID_NEED_MAP"};
const GuestBatchKey k_MISSING_INPUTS{"MISSING_INPUTS"};
const GuestBatchKey k_MISSING_PERMISSION{"MISSING_PERMISSION"};
const GuestBatchKey k_QUALITY_TOO_LOW{"QUALITY_TOO_LOW"};
const GuestBatchKey k_RISK_REFUSED{"RISK_REFUSED"};
const GuestBatchKey k_UNREACHABLE{"UNREACHABLE"};
const GuestBatchKey k_WAIT_HARD_LIMIT{"WAIT_HARD_LIMIT"};
const GuestBatchKey k_absolute_minute{"absolute_minute"};
const GuestBatchKey k_accepted{"accepted"};
const GuestBatchKey k_addiction_by_tag{"addiction_by_tag"};
const GuestBatchKey k_adult{"adult"};
const GuestBatchKey k_adult_content_enabled{"adult_content_enabled"};
const GuestBatchKey k_adult_only{"adult_only"};
const GuestBatchKey k_adult_verified{"adult_verified"};
const GuestBatchKey k_allow_credit{"allow_credit"};
const GuestBatchKey k_allowed_guest_types{"allowed_guest_types"};
const GuestBatchKey k_credit_allowed{"credit_allowed"};
const GuestBatchKey k_credit_limit_gold{"credit_limit_gold"};
const GuestBatchKey k_current_minute{"current_minute"};
const GuestBatchKey k_debt_gold{"debt_gold"};
const GuestBatchKey k_discretionary{"discretionary"};
const GuestBatchKey k_entertainment{"entertainment"};
const GuestBatchKey k_estimated_total_gold{"estimated_total_gold"};
const GuestBatchKey k_exit_reason{"exit_reason"};
const GuestBatchKey k_exit_threshold{"exit_threshold"};
const GuestBatchKey k_expected_quality{"expected_quality"};
const GuestBatchKey k_expected_wait{"expected_wait"};
const GuestBatchKey k_facility_id{"facility_id"};
const GuestBatchKey k_facility_tags{"facility_tags"};
const GuestBatchKey k_forbidden_guest_tags{"forbidden_guest_tags"};
const GuestBatchKey k_frugal{"frugal"};
const GuestBatchKey k_gambling{"gambling"};
const GuestBatchKey k_get_definition{"get_definition"};
const GuestBatchKey k_get_guest{"get_guest"};
const GuestBatchKey k_group_fit{"group_fit"};
const GuestBatchKey k_guest_type_id{"guest_type_id"};
const GuestBatchKey k_hunger{"hunger"};
const GuestBatchKey k_hygiene{"hygiene"};
const GuestBatchKey k_illegal_level{"illegal_level"};
const GuestBatchKey k_inputs_available{"inputs_available"};
const GuestBatchKey k_instance_id{"instance_id"};
const GuestBatchKey k_intimacy{"intimacy"};
const GuestBatchKey k_is_open{"is_open"};
const GuestBatchKey k_legal_permission_override{"legal_permission_override"};
const GuestBatchKey k_legal_sensitivity{"legal_sensitivity"};
const GuestBatchKey k_leisure{"leisure"};
const GuestBatchKey k_medical{"medical"};
const GuestBatchKey k_minimum_quality{"minimum_quality"};
const GuestBatchKey k_need_effects{"need_effects"};
const GuestBatchKey k_need_priority{"need_priority"};
const GuestBatchKey k_need_relief{"need_relief"};
const GuestBatchKey k_needs{"needs"};
const GuestBatchKey k_novelty{"novelty"};
const GuestBatchKey k_ok{"ok"};
const GuestBatchKey k_open{"open"};
const GuestBatchKey k_open_at_arrival{"open_at_arrival"};
const GuestBatchKey k_ordered{"ordered"};
const GuestBatchKey k_planned_exit_at{"planned_exit_at"};
const GuestBatchKey k_preference{"preference"};
const GuestBatchKey k_preference_weights{"preference_weights"};
const GuestBatchKey k_price_burden{"price_burden"};
const GuestBatchKey k_price_gold{"price_gold"};
const GuestBatchKey k_quality{"quality"};
const GuestBatchKey k_quoted_price{"quoted_price"};
const GuestBatchKey k_ranked{"ranked"};
const GuestBatchKey k_reachable{"reachable"};
const GuestBatchKey k_reason{"reason"};
const GuestBatchKey k_rejected{"rejected"};
const GuestBatchKey k_repetition_penalty{"repetition_penalty"};
const GuestBatchKey k_required_guest_tags{"required_guest_tags"};
const GuestBatchKey k_requires_adult_verified{"requires_adult_verified"};
const GuestBatchKey k_respect_survival_reserve{"respect_survival_reserve"};
const GuestBatchKey k_risk{"risk"};
const GuestBatchKey k_risk_level{"risk_level"};
const GuestBatchKey k_risk_sensitivity{"risk_sensitivity"};
const GuestBatchKey k_risk_tolerance{"risk_tolerance"};
const GuestBatchKey k_service_category{"service_category"};
const GuestBatchKey k_sleep{"sleep"};
const GuestBatchKey k_spendthrift{"spendthrift"};
const GuestBatchKey k_supported{"supported"};
const GuestBatchKey k_tags{"tags"};
const GuestBatchKey k_tourism{"tourism"};
const GuestBatchKey k_travel_minutes{"travel_minutes"};
const GuestBatchKey k_urgency{"urgency"};
const GuestBatchKey k_utility{"utility"};
const GuestBatchKey k_utility_terms{"utility_terms"};
const GuestBatchKey k_visited_facility_ids{"visited_facility_ids"};
const GuestBatchKey k_wait_hard_limit{"wait_hard_limit"};
const GuestBatchKey k_wait_minutes{"wait_minutes"};
const GuestBatchKey k_wallet_gold{"wallet_gold"};
Variant value(const Dictionary &d,const GuestBatchKey &k,const Variant &fallback=Variant()) {
if(d.has(k.name)) return d[k.name];
return d.has(k.text) ? d[k.text] : fallback;
}
bool has(const Dictionary &d,const GuestBatchKey &k) { return d.has(k.name) || d.has(k.text); }
int64_t integer(const Dictionary &d,const GuestBatchKey &k,int64_t fallback=0) { return value(d,k,fallback); }
bool flag(const Dictionary &d,const GuestBatchKey &k,bool fallback=false) {
const Variant v=value(d,k,fallback);
return v.get_type()==Variant::INT ? int64_t(v)!=0 : bool(v);
}
};
struct GuestBatchRow {
Dictionary candidate,relief;
StringName id;
String id_text;
bool need_map_valid=true;
int64_t priority=0,utility=0,urgency=0,travel=0;
};
struct GuestBatchFacilityOrder {
bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const { return a.id_text < b.id_text; }
};
struct GuestBatchRankOrder {
bool operator()(const GuestBatchRow &a,const GuestBatchRow &b) const {
if(a.priority!=b.priority) return a.priority>b.priority;
if(a.utility!=b.utility) return a.utility>b.utility;
if(a.urgency!=b.urgency) return a.urgency>b.urgency;
if(a.travel!=b.travel) return a.travel<b.travel;
return a.id_text<b.id_text;
}
};
static int64_t guest_sub(int64_t a,int64_t b) {
return the_tree_native::signed_add(a,the_tree_native::signed_add(~b,1));
}
static int64_t guest_clamp(int64_t x,int64_t low,int64_t high) {
return std::min<int64_t>(std::max<int64_t>(x,low),high);
}
static bool guest_name_value(const Variant &v) {
return v.get_type()==Variant::STRING || v.get_type()==Variant::STRING_NAME;
}
static bool guest_names_supported(const Variant &v) {
// The original name helper ignores non-arrays, but converting unusual
// array elements is deliberately left to the original GDScript path.
if(v.get_type()!=Variant::ARRAY) return true;
const Array a=v;
for(int64_t i=0;i<a.size();++i) if(!guest_name_value(a[i])) return false;
return true;
}
static Array guest_names(const Variant &v) {
Array out;
if(v.get_type()!=Variant::ARRAY) return out;
const Array a=v;
for(int64_t i=0;i<a.size();++i) {
const StringName name=a[i];
if(!name.is_empty() && !out.has(name)) out.append(name);
}
// Membership is unordered. Preference additions below use this same
// lexical ordering as GuestDefinition's sorted unique name helper.
std::vector<String> ordered;
for(int64_t i=0;i<out.size();++i) { const StringName name=out[i]; ordered.emplace_back(String(name)); }
SortArray<String> sorter;
if(!ordered.empty()) sorter.sort(ordered.data(),ordered.size());
out.clear();for(const String &s:ordered) out.append(StringName(s));
return out;
}
static bool guest_normalize_need(GuestBatchNames &n,const Variant &v,Dictionary &out) {
if(v.get_type()!=Variant::DICTIONARY) return false;
const Dictionary source=v;
if(source.size()>6) return false;
const Array keys=source.keys();
for(int64_t i=0;i<keys.size();++i) {
if(!guest_name_value(keys[i])) return false;
const StringName k=keys[i];
bool valid=false;
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) if(k==s->name) {valid=true;break;}
if(!valid || out.has(k) || source[keys[i]].get_type()!=Variant::INT) return false;
out[k]=source[keys[i]];
}
return true;
}
static bool guest_candidate_supported(GuestBatchNames &n,const Dictionary &d) {
// Adding canonical/result StringName keys to a typed dictionary can
// invoke conversion/error semantics; that entire domain stays original.
if(d.is_typed()) return false;
for(const GuestBatchKey *s: {&n.k_travel_minutes,&n.k_wait_minutes,&n.k_expected_wait,&n.k_wait_hard_limit,&n.k_risk_level,&n.k_risk,&n.k_illegal_level,&n.k_expected_quality,&n.k_quality,&n.k_minimum_quality,&n.k_estimated_total_gold,&n.k_price_gold,&n.k_quoted_price,&n.k_need_priority,&n.k_preference,&n.k_novelty,&n.k_group_fit,&n.k_price_burden,&n.k_risk_sensitivity,&n.k_repetition_penalty,&n.k_urgency})
if(n.has(d,*s) && n.value(d,*s).get_type()!=Variant::INT) return false;
for(const GuestBatchKey *s: {&n.k_inputs_available,&n.k_adult_only,&n.k_requires_adult_verified,&n.k_is_open,&n.k_open,&n.k_open_at_arrival,&n.k_reachable,&n.k_credit_allowed,&n.k_allow_credit,&n.k_discretionary,&n.k_respect_survival_reserve,&n.k_legal_permission_override,&n.k_ok}) {
if(!n.has(d,*s)) continue;
const Variant::Type t=n.value(d,*s).get_type();
if(t!=Variant::BOOL && t!=Variant::INT) return false;
}
for(const GuestBatchKey *s: {&n.k_facility_id,&n.k_instance_id,&n.k_service_category}) if(n.has(d,*s) && !guest_name_value(n.value(d,*s))) return false;
for(const GuestBatchKey *s: {&n.k_required_guest_tags,&n.k_forbidden_guest_tags,&n.k_allowed_guest_types,&n.k_facility_tags,&n.k_tags}) if(!guest_names_supported(n.value(d,*s,Array()))) return false;
return true;
}
static int64_t guest_price(GuestBatchNames &n,const Dictionary &c) {
return std::max<int64_t>(int64_t(n.value(c,n.k_estimated_total_gold,n.value(c,n.k_price_gold,n.value(c,n.k_quoted_price,int64_t(0))))),0);
}
static bool guest_discretionary(GuestBatchNames &n,const Dictionary &c) {
if(n.flag(c,n.k_discretionary)) return true;
const StringName category=n.value(c,n.k_service_category,n.k_empty.name);
for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_intimacy,&n.k_tourism}) if(category==s->name) return true;
const Array tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array())));
for(const GuestBatchKey *s: {&n.k_leisure,&n.k_entertainment,&n.k_gambling,&n.k_adult,&n.k_intimacy}) if(tags.has(s->name)) return true;
return false;
}
static StringName guest_rejection(GuestBatchNames &n,const GuestBatchRow &row,
const Dictionary &context,const StringName &type,const Array &tags,bool adult,
int64_t planned_exit,int64_t decision_minute,int64_t cash,int64_t credit,
int64_t reserve,int64_t tolerance,int64_t legal,int64_t minimum) {
const Dictionary &c=row.candidate;
if(!row.need_map_valid) return n.k_INVALID_NEED_MAP.name;
if(!n.flag(c,n.k_inputs_available,true)) return n.k_MISSING_INPUTS.name;
if(n.flag(c,n.k_adult_only,n.flag(c,n.k_requires_adult_verified))) {
if(!adult) return n.k_ADULT_NOT_VERIFIED.name;
if(!n.flag(context,n.k_adult_content_enabled,true)) return n.k_CONTENT_FILTERED.name;
}
const Array required=guest_names(n.value(c,n.k_required_guest_tags,Array()));
for(int64_t i=0;i<required.size();++i) if(!tags.has(required[i])) return n.k_MISSING_PERMISSION.name;
const Array forbidden=guest_names(n.value(c,n.k_forbidden_guest_tags,Array()));
for(int64_t i=0;i<forbidden.size();++i) if(tags.has(forbidden[i])) return n.k_FORBIDDEN_GUEST_TAG.name;
const Array allowed=guest_names(n.value(c,n.k_allowed_guest_types,Array()));
if(!allowed.is_empty() && !allowed.has(type)) return n.k_GUEST_TYPE_NOT_ALLOWED.name;
if(!n.flag(c,n.k_is_open,n.flag(c,n.k_open,true)) && !n.flag(c,n.k_open_at_arrival)) return n.k_FACILITY_CLOSED.name;
if(!n.flag(c,n.k_reachable,true)) return n.k_UNREACHABLE.name;
const int64_t travel=std::max<int64_t>(n.integer(c,n.k_travel_minutes),0);
if(decision_minute>=0 && the_tree_native::signed_add(decision_minute,travel)>planned_exit) return n.k_ETA_AFTER_EXIT.name;
const int64_t price=guest_price(n,c);
const int64_t available=n.flag(c,n.k_respect_survival_reserve,guest_discretionary(n,c)) ? std::max<int64_t>(guest_sub(cash,reserve),0) : cash;
if(price>available && (!n.flag(c,n.k_credit_allowed,n.flag(c,n.k_allow_credit)) || guest_sub(price,available)>credit)) return n.k_CANNOT_PAY.name;
const int64_t wait=std::max<int64_t>(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0);
const int64_t hard=std::max<int64_t>(int64_t(n.value(c,n.k_wait_hard_limit,n.value(context,n.k_wait_hard_limit,int64_t(120)))),0);
if(wait>=hard) return n.k_WAIT_HARD_LIMIT.name;
const int64_t risk=guest_clamp(int64_t(n.value(c,n.k_risk_level,n.value(c,n.k_risk,int64_t(0)))),0,100);
if(risk>tolerance) return n.k_RISK_REFUSED.name;
if(guest_clamp(n.integer(c,n.k_illegal_level),0,100)>guest_sub(100,legal) && !n.flag(c,n.k_legal_permission_override)) return n.k_ILLEGALITY_REFUSED.name;
const int64_t quality=guest_clamp(int64_t(n.value(c,n.k_expected_quality,n.value(c,n.k_quality,int64_t(0)))),0,100);
if(quality<guest_clamp(n.integer(c,n.k_minimum_quality,minimum),0,100)) return n.k_QUALITY_TOO_LOW.name;
return n.k_empty.name;
}
static void guest_evaluate(GuestBatchNames &n,GuestBatchRow &row,const Dictionary &needs,
const Dictionary &weights,const Array &visited,int64_t cash,int64_t credit,int64_t tolerance) {
const Dictionary &c=row.candidate;
int64_t relief=0,default_urgency=0,priority=0;
const Variant raw_relief=n.value(c,n.k_need_relief,int64_t(0));
if(raw_relief.get_type()==Variant::INT) relief=std::max<int64_t>(int64_t(raw_relief),0);
else if(raw_relief.get_type()==Variant::DICTIONARY) {
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) {
const int64_t effect=row.relief.get(s->name,int64_t(0));
const int64_t need=needs[s->name];
relief=std::max<int64_t>(relief,signed_product(std::max<int64_t>(effect,0),need)/100);
if(effect>0) {
default_urgency=std::max<int64_t>(default_urgency,need);
if(s->name==n.k_hunger.name || s->name==n.k_sleep.name || s->name==n.k_leisure.name || s->name==n.k_intimacy.name) priority=std::max<int64_t>(priority,need);
}
}
}
int64_t default_preference=0;
const Array facility_tags=guest_names(n.value(c,n.k_facility_tags,n.value(c,n.k_tags,Array())));
for(int64_t i=0;i<facility_tags.size();++i) default_preference=the_tree_native::signed_add(default_preference,int64_t(weights.get(facility_tags[i],int64_t(0))));
const int64_t preference=n.integer(c,n.k_preference,default_preference);
const int64_t quality=n.value(c,n.k_expected_quality,n.value(c,n.k_quality,int64_t(0)));
const bool seen=visited.has(row.id);
const int64_t novelty=n.integer(c,n.k_novelty,seen?0:10),group=n.integer(c,n.k_group_fit);
const int64_t power=std::max<int64_t>(the_tree_native::signed_add(cash,credit),1);
const int64_t numerator=guest_sub(the_tree_native::signed_add(signed_product(guest_price(n,c),100),power),1);
const int64_t burden=n.integer(c,n.k_price_burden,guest_clamp(numerator/power,0,100));
const int64_t travel=std::max<int64_t>(n.integer(c,n.k_travel_minutes),0);
const int64_t wait=std::max<int64_t>(int64_t(n.value(c,n.k_wait_minutes,n.value(c,n.k_expected_wait,int64_t(0)))),0);
const int64_t risk=std::max<int64_t>(int64_t(n.value(c,n.k_risk,n.value(c,n.k_risk_level,int64_t(0)))),0);
const int64_t sensitivity=std::max<int64_t>(n.integer(c,n.k_risk_sensitivity,the_tree_native::signed_add(guest_sub(100,tolerance),24)/25),0);
const int64_t repetition=n.integer(c,n.k_repetition_penalty,seen?10:0);
int64_t utility=signed_product(relief,8);
utility=the_tree_native::signed_add(utility,signed_product(preference,5));
utility=the_tree_native::signed_add(utility,signed_product(quality,3));
utility=the_tree_native::signed_add(utility,signed_product(novelty,2));
utility=the_tree_native::signed_add(utility,signed_product(group,2));
utility=guest_sub(utility,signed_product(burden,5));
utility=guest_sub(utility,signed_product(travel,2));
utility=guest_sub(utility,signed_product(wait,3));
utility=guest_sub(utility,signed_product(risk,sensitivity));
utility=guest_sub(utility,repetition);
Dictionary result=c.duplicate(true);
result[n.k_facility_id.name]=row.id;result[n.k_need_priority.name]=priority;
result[n.k_utility.name]=utility;result[n.k_urgency.name]=n.integer(c,n.k_urgency,default_urgency);result[n.k_travel_minutes.name]=travel;
Dictionary terms;
terms[n.k_need_relief.name]=relief;terms[n.k_preference.name]=preference;terms[n.k_expected_quality.name]=quality;
terms[n.k_novelty.name]=novelty;terms[n.k_group_fit.name]=group;terms[n.k_price_burden.name]=burden;
terms[n.k_travel_minutes.name]=travel;terms[n.k_wait_minutes.name]=wait;terms[n.k_risk.name]=risk;
terms[n.k_risk_sensitivity.name]=sensitivity;terms[n.k_repetition_penalty.name]=repetition;
result[n.k_utility_terms.name]=terms;
row.candidate=result;row.priority=priority;row.utility=utility;row.urgency=result[n.k_urgency.name];row.travel=travel;
}
public:
Dictionary guest_candidate_batch(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) {
// No owner/input mutation occurs in the entire implementation. A failed
// new standard-container allocation cannot escape the native boundary
// or publish a partially built result. Engine-internal allocation failure
// is not claimed to be covered by these standard C++ exception catches.
Dictionary unsupported;unsupported[StringName("supported",false)]=false;
try { return guest_candidate_batch_impl(owner,guest_id,facilities,context); }
catch(const std::bad_alloc &) { return unsupported; }
catch(const std::length_error &) { return unsupported; }
}
private:
Dictionary guest_candidate_batch_impl(Object *owner,const StringName &guest_id,const Array &facilities,const Dictionary &context) {
GuestBatchNames n;const ProjectionNames p;
Dictionary unsupported;unsupported[n.k_supported.name]=false;
if(!builtin(p,owner,"res://scripts/guest/guest_service.gd")) return unsupported;
// No caller callback is invoked during preflight or computation. Callback
// contexts use original extraction/evaluation/decision in their entirety.
const Array context_keys=context.keys();
for(int64_t i=0;i<context_keys.size();++i) {
if(!guest_name_value(context_keys[i])) return unsupported;
const StringName k=context_keys[i];
if(k!=n.k_absolute_minute.name && k!=n.k_wait_hard_limit.name && k!=n.k_adult_content_enabled.name && k!=n.k_exit_threshold.name && k!=n.k_exit_reason.name) return unsupported;
}
for(const GuestBatchKey *s: {&n.k_absolute_minute,&n.k_wait_hard_limit,&n.k_exit_threshold}) if(n.has(context,*s) && n.value(context,*s).get_type()!=Variant::INT) return unsupported;
if(n.has(context,n.k_adult_content_enabled) && n.value(context,n.k_adult_content_enabled).get_type()!=Variant::BOOL && n.value(context,n.k_adult_content_enabled).get_type()!=Variant::INT) return unsupported;
if(n.has(context,n.k_exit_reason) && !guest_name_value(n.value(context,n.k_exit_reason))) return unsupported;
Object *guest=owner->call(n.k_get_guest.name,guest_id);
if(!builtin(p,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
const Variant typev=guest->get(n.k_guest_type_id.name);
if(!guest_name_value(typev)) return unsupported;
const StringName type=typev;
Object *definition=owner->call(n.k_get_definition.name,type);
if(!builtin(p,definition,"res://scripts/guest/guest_definition.gd")) return unsupported;
for(const GuestBatchKey *s: {&n.k_wallet_gold,&n.k_credit_limit_gold,&n.k_debt_gold,&n.k_planned_exit_at}) if(guest->get(s->name).get_type()!=Variant::INT) return unsupported;
for(const GuestBatchKey *s: {&n.k_risk_tolerance,&n.k_legal_sensitivity,&n.k_minimum_quality}) if(definition->get(s->name).get_type()!=Variant::INT) return unsupported;
if(definition->get(n.k_adult_verified.name).get_type()!=Variant::BOOL || owner->get(n.k_current_minute.name).get_type()!=Variant::INT) return unsupported;
if(guest->get(n.k_needs.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_addiction_by_tag.name).get_type()!=Variant::DICTIONARY || guest->get(n.k_visited_facility_ids.name).get_type()!=Variant::ARRAY || definition->get(n.k_tags.name).get_type()!=Variant::ARRAY || definition->get(n.k_preference_weights.name).get_type()!=Variant::DICTIONARY) return unsupported;
const Dictionary needs=guest->get(n.k_needs.name),addiction=guest->get(n.k_addiction_by_tag.name),weights=definition->get(n.k_preference_weights.name);
const Array visited=guest->get(n.k_visited_facility_ids.name),tags=definition->get(n.k_tags.name);
if(!guest_names_supported(visited) || !guest_names_supported(tags)) return unsupported;
for(const GuestBatchKey *s: {&n.k_hunger,&n.k_sleep,&n.k_hygiene,&n.k_medical,&n.k_leisure,&n.k_intimacy}) if(!needs.has(s->name) || needs[s->name].get_type()!=Variant::INT) return unsupported;
const Array addiction_values=addiction.values(),weight_values=weights.values();
int64_t max_addiction=0;
for(int64_t i=0;i<addiction_values.size();++i) {if(addiction_values[i].get_type()!=Variant::INT) return unsupported;max_addiction=std::max<int64_t>(max_addiction,int64_t(addiction_values[i]));}
for(int64_t i=0;i<weight_values.size();++i) if(weight_values[i].get_type()!=Variant::INT) return unsupported;
// Finish checking all potentially converted input fields before creating
// outputs. All getters above are the fixed builtin pure getters.
for(int64_t i=0;i<facilities.size();++i) if(facilities[i].get_type()==Variant::DICTIONARY && !guest_candidate_supported(n,Dictionary(facilities[i]))) return unsupported;
std::vector<GuestBatchRow> ordered;
for(int64_t i=0;i<facilities.size();++i) {
if(facilities[i].get_type()!=Variant::DICTIONARY) continue;
const Dictionary raw=facilities[i];
const StringName id=n.value(raw,n.k_facility_id,n.value(raw,n.k_instance_id,n.k_empty.name));
if(id.is_empty()) continue;
GuestBatchRow row;row.id=id;row.id_text=String(id);row.candidate=raw.duplicate(true);row.candidate[n.k_facility_id.name]=id;
for(const GuestBatchKey *s: {&n.k_need_relief,&n.k_need_effects}) {
if(!n.has(row.candidate,*s)) continue;
const Variant v=n.value(row.candidate,*s);
if(s->name==n.k_need_relief.name && v.get_type()==Variant::INT) continue;
Dictionary normalized;
if(!guest_normalize_need(n,v,normalized)) {row.need_map_valid=false;break;}
if(s->name==n.k_need_relief.name) row.relief=normalized;
}
ordered.push_back(row);
}
SortArray<GuestBatchRow,GuestBatchFacilityOrder> facility_sort;
if(!ordered.empty()) facility_sort.sort(ordered.data(),ordered.size());
const int64_t cash=guest->get(n.k_wallet_gold.name);
const int64_t credit=std::max<int64_t>(guest_sub(guest->get(n.k_credit_limit_gold.name),guest->get(n.k_debt_gold.name)),0);
int64_t reserve=0;
if(max_addiction<75) reserve=tags.has(n.k_spendthrift.name) ? cash/10 : (tags.has(n.k_frugal.name) ? cash/2 : signed_product(cash,3)/10);
const int64_t tolerance=definition->get(n.k_risk_tolerance.name);
const int64_t minute=n.integer(context,n.k_absolute_minute,owner->get(n.k_current_minute.name));
TypedArray<Dictionary> raw_ordered,accepted,rejected,ranked;
std::vector<GuestBatchRow> rank_rows;
for(GuestBatchRow &row:ordered) {
raw_ordered.append(row.candidate);
const StringName reason=guest_rejection(n,row,context,type,tags,definition->get(n.k_adult_verified.name),guest->get(n.k_planned_exit_at.name),minute,cash,credit,reserve,tolerance,definition->get(n.k_legal_sensitivity.name),definition->get(n.k_minimum_quality.name));
if(!reason.is_empty()) {Dictionary failure;failure[n.k_facility_id.name]=row.id_text;failure[n.k_reason.name]=String(reason);rejected.append(failure);continue;}
accepted.append(row.candidate);
guest_evaluate(n,row,needs,weights,visited,cash,credit,tolerance);
if(n.flag(row.candidate,n.k_ok,true)) rank_rows.push_back(row);
}
SortArray<GuestBatchRow,GuestBatchRankOrder> rank_sort;
if(!rank_rows.empty()) rank_sort.sort(rank_rows.data(),rank_rows.size());
for(const GuestBatchRow &row:rank_rows) ranked.append(row.candidate);
Dictionary result;result[n.k_supported.name]=true;result[n.k_ordered.name]=raw_ordered;
result[n.k_accepted.name]=accepted;result[n.k_rejected.name]=rejected;result[n.k_ranked.name]=ranked;
return result;
}
public:
@@ -0,0 +1,78 @@
#pragma once
// Standalone numeric prototype; not connected to Godot or production.
#include <algorithm>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <limits>
#include <map>
#include <queue>
#include <functional>
#include <utility>
#include <stdexcept>
#include <string>
#include <vector>
namespace the_tree_native {
using I = std::int64_t;
struct Edge { I neighbor, cost; };
struct Result {
std::string status = "usable";
std::vector<I> costs, parents, discovered, parent_discovered, settled;
};
I signed_add(I a, I b) {
const auto sum = static_cast<std::uint64_t>(a) + static_cast<std::uint64_t>(b);
if (sum <= static_cast<std::uint64_t>(std::numeric_limits<I>::max())) return static_cast<I>(sum);
return std::numeric_limits<I>::min() + static_cast<I>(sum - (std::uint64_t(1) << 63));
}
template <typename EdgeProvider>
Result search(I n, I start, const std::vector<I>& goals, EdgeProvider&& edge_provider) {
Result r;
if (start < 0 || start >= n) { r.status = "unusable"; return r; }
r.costs.assign(n, std::numeric_limits<I>::max());
r.parents.assign(n, -1);
std::vector<unsigned char> finalized(n, 0), pending(n, 0);
bool unknown_goal = false;
I remaining = 0;
for (I goal : goals) {
if (goal < 0 || goal >= n) { unknown_goal = true; continue; }
if (!pending[goal]) { pending[goal] = 1; ++remaining; }
}
r.costs[start] = 0; r.discovered.push_back(start);
// Positive edges cannot enqueue another node at this entry cost.
// Lexicographic (cost,index) ordering preserves the old sorted cost buckets.
using Entry=std::pair<I,I>;
std::priority_queue<Entry,std::vector<Entry>,std::greater<Entry>> frontier;
frontier.emplace(0,start);
while (!frontier.empty()) {
const auto entry=frontier.top();frontier.pop();
const I entry_cost=entry.first,current=entry.second;
{
if (finalized[current] || entry_cost != r.costs[current]) continue;
finalized[current] = 1;
r.settled.push_back(current);
if (pending[current]) { pending[current] = 0; --remaining; }
if (!remaining && !unknown_goal) return r;
for (const Edge& edge : edge_provider(current)) {
if (edge.cost <= 0) { r.status = "unusable"; return r; }
const I neighbor = edge.neighbor;
if (neighbor < 0 || neighbor >= n) { r.status = "unusable"; return r; }
const I cost = signed_add(r.costs[current], edge.cost);
if (cost < r.costs[current]) { r.status = "wrapped"; return r; }
const I known = r.costs[neighbor];
const bool better_parent = cost == known && r.parents[neighbor] >= 0 && current < r.parents[neighbor];
if (cost > known || (cost == known && !better_parent)) continue;
if (r.parents[neighbor] < 0) {
r.parent_discovered.push_back(neighbor);
if (neighbor != start) r.discovered.push_back(neighbor);
}
r.parents[neighbor] = current;
r.costs[neighbor] = cost;
if (finalized[neighbor]) r.settled.erase(std::remove(r.settled.begin(), r.settled.end(), neighbor), r.settled.end());
finalized[neighbor] = 0;
frontier.emplace(cost,neighbor);
}
}
}
return r;
}
} // namespace the_tree_native
@@ -0,0 +1,895 @@
// Isolated, uncompiled bridge prototype. No production registration or integration yet.
#include "tree_core.hpp"
#include <cmath>
#include <array>
#include <new>
#include <stdexcept>
#include <godot_cpp/templates/sort_array.hpp>
#include <godot_cpp/classes/ref_counted.hpp>
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/variant/vector3i.hpp>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/godot.hpp>
#include <godot_cpp/variant/array.hpp>
#include <godot_cpp/variant/callable.hpp>
#include <godot_cpp/variant/dictionary.hpp>
#include <godot_cpp/variant/packed_int64_array.hpp>
#include <godot_cpp/variant/typed_array.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
using namespace godot;
using the_tree_native::I;
using the_tree_native::Edge;
class TheTreeNumericCore : public RefCounted {
GDCLASS(TheTreeNumericCore, RefCounted)
protected:
static void _bind_methods() {
ClassDB::bind_method(D_METHOD("performance_record_sample", "owner", "metric_id", "duration_us"), &TheTreeNumericCore::performance_record_sample);
ClassDB::bind_method(D_METHOD("guest_candidate_batch", "owner", "guest_id", "facilities", "context"), &TheTreeNumericCore::guest_candidate_batch);
ClassDB::bind_method(D_METHOD("guest_tree_edge_rows", "path", "current", "layers", "access"), &TheTreeNumericCore::guest_tree_edge_rows);
ClassDB::bind_method(D_METHOD("search", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search);
ClassDB::bind_method(D_METHOD("search_cached", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search_cached);
ClassDB::bind_method(D_METHOD("clear_edge_cache"), &TheTreeNumericCore::clear_edge_cache);
ClassDB::bind_method(D_METHOD("nearest_guest_access", "path", "start", "goals", "fallback_target", "layers", "access", "ticks"), &TheTreeNumericCore::nearest_guest_access);
ClassDB::bind_method(D_METHOD("project_guest_candidates", "runtime", "guest_id", "open_state", "degraded_state", "movement_scale", "stair_credit", "orthogonal_cost", "ticks"), &TheTreeNumericCore::project_guest_candidates);
}
private:
// Cache belongs to this instance and one caller-owned graph workspace.
// No reuse after cells, indices, filters or edge values change: the caller
// must clear it or release this core. The original search never uses it.
std::map<I, std::vector<Edge>> cached_edges;
// Per-public-call immutable names. No static/global lifetime, cached
// object values, script dispatch result or profile; recursive calls own
// separate scopes. Destruction precedes leaving the engine call.
struct ProjectionNames {
const StringName k_ACCESS_LAYER_DENIED{"ACCESS_LAYER_DENIED",false};
const StringName k_CONNECTOR{"CONNECTOR",false};
const StringName k_GOAL_NOT_PASSABLE{"GOAL_NOT_PASSABLE",false};
const StringName k_GOAL_TEMPORARILY_BLOCKED{"GOAL_TEMPORARILY_BLOCKED",false};
const StringName k_GOAL_UNREACHABLE{"GOAL_UNREACHABLE",false};
const StringName k_OK{"OK",false};
const StringName k_START_NOT_PASSABLE{"START_NOT_PASSABLE",false};
const StringName k_START_TEMPORARILY_BLOCKED{"START_TEMPORARILY_BLOCKED",false};
const StringName k__build_guest_query_tree_compact{"_build_guest_query_tree_compact",false};
const StringName k__cache_key{"_cache_key",false};
const StringName k__cell_traffic{"_cell_traffic",false};
const StringName k__copy_path{"_copy_path",false};
const StringName k__diagnose_no_route_reason{"_diagnose_no_route_reason",false};
const StringName k__find_facility_access_path{"_find_facility_access_path",false};
const StringName k__find_path_internal{"_find_path_internal",false};
const StringName k__guest_access_batch_can_select{"_guest_access_batch_can_select",false};
const StringName k__guest_batch_has_permitted_layer_crossing{"_guest_batch_has_permitted_layer_crossing",false};
const StringName k__guest_has_checked_in{"_guest_has_checked_in",false};
const StringName k__guest_step_connector_memo{"_guest_step_connector_memo",false};
const StringName k__guest_tree_arithmetic_wrapped{"_guest_tree_arithmetic_wrapped",false};
const StringName k__guest_tree_reconstruct_path{"_guest_tree_reconstruct_path",false};
const StringName k__need_relief_for_facility_tags{"_need_relief_for_facility_tags",false};
const StringName k__passable_cells{"_passable_cells",false};
const StringName k__path_cache{"_path_cache",false};
const StringName k__query_batch{"_query_batch",false};
const StringName k__route_failure{"_route_failure",false};
const StringName k__service_category_for_tags{"_service_category_for_tags",false};
const StringName k__sorted_name_keys{"_sorted_name_keys",false};
const StringName k_arithmetic_wrapped{"arithmetic_wrapped",false};
const StringName k_available_quantity{"available_quantity",false};
const StringName k_base_quality{"base_quality",false};
const StringName k_base_service_minutes{"base_service_minutes",false};
const StringName k_begin_guest_path_query_batch{"begin_guest_path_query_batch",false};
const StringName k_cache_misses{"cache_misses",false};
const StringName k_calculate_guest_batch_path_cost{"calculate_guest_batch_path_cost",false};
const StringName k_candidates{"candidates",false};
const StringName k_capacity{"capacity",false};
const StringName k_compact{"compact",false};
const StringName k_cost{"cost",false};
const StringName k_cost_values{"cost_values",false};
const StringName k_costs{"costs",false};
const StringName k_current_cell{"current_cell",false};
const StringName k_definition_id{"definition_id",false};
const StringName k_definition_registry{"definition_registry",false};
const StringName k_elevators{"elevators",false};
const StringName k_end_guest_path_query_batch{"end_guest_path_query_batch",false};
const StringName k_entrance{"entrance",false};
const StringName k_estimated_total_gold{"estimated_total_gold",false};
const StringName k_expected_quality{"expected_quality",false};
const StringName k_expected_wait{"expected_wait",false};
const StringName k_facility_id{"facility_id",false};
const StringName k_facility_service{"facility_service",false};
const StringName k_facility_tags{"facility_tags",false};
const StringName k_get_connector{"get_connector",false};
const StringName k_get_facility{"get_facility",false};
const StringName k_get_facility_business_price{"get_facility_business_price",false};
const StringName k_get_guest{"get_guest",false};
const StringName k_get_instances{"get_instances",false};
const StringName k_get_step_connector{"get_step_connector",false};
const StringName k_graph_revision{"graph_revision",false};
const StringName k_group_fit{"group_fit",false};
const StringName k_guest_service{"guest_service",false};
const StringName k_illegal_level{"illegal_level",false};
const StringName k_indices{"indices",false};
const StringName k_inputs_available{"inputs_available",false};
const StringName k_instance_id{"instance_id",false};
const StringName k_inventory_inputs{"inventory_inputs",false};
const StringName k_inventory_service{"inventory_service",false};
const StringName k_is_open{"is_open",false};
const StringName k_last_error{"last_error",false};
const StringName k_last_no_route_reason{"last_no_route_reason",false};
const StringName k_last_path_cost{"last_path_cost",false};
const StringName k_local_inventory_id{"local_inventory_id",false};
const StringName k_movement_type{"movement_type",false};
const StringName k_need_relief{"need_relief",false};
const StringName k_occupied_cells{"occupied_cells",false};
const StringName k_origin{"origin",false};
const StringName k_owns_connector{"owns_connector",false};
const StringName k_path{"path",false};
const StringName k_path_handle{"path_handle",false};
const StringName k_path_query_measured{"path_query_measured",false};
const StringName k_path_service{"path_service",false};
const StringName k_queue_entries{"queue_entries",false};
const StringName k_reachable{"reachable",false};
const StringName k_ready{"ready",false};
const StringName k_resource_path{"resource_path",false};
const StringName k_risk_level{"risk_level",false};
const StringName k_service_category{"service_category",false};
const StringName k_settled{"settled",false};
const StringName k_staff_only{"staff_only",false};
const StringName k_start{"start",false};
const StringName k_state{"state",false};
const StringName k_supported{"supported",false};
const StringName k_tags{"tags",false};
const StringName k_tagproj_hunger{"hunger",false};
const StringName k_tagproj_sleep{"sleep",false};
const StringName k_tagproj_hygiene{"hygiene",false};
const StringName k_tagproj_medical{"medical",false};
const StringName k_tagproj_leisure{"leisure",false};
const StringName k_tagproj_intimacy{"intimacy",false};
const StringName k_tagproj_dining{"dining",false};
const StringName k_tagproj_lodging{"lodging",false};
const StringName k_tagproj_social{"social",false};
const StringName k_tagproj_bath{"bath",false};
const StringName k_tagproj_wellness{"wellness",false};
const StringName k_tagproj_adult_only{"adult_only",false};
const StringName k_tagproj_restricted_service{"restricted_service",false};
const StringName k_tagproj_food{"food",false};
const StringName k_tagproj_service{"service",false};
const StringName k_target_cell{"target_cell",false};
const StringName k_targets{"targets",false};
const StringName k_temporary_block{"temporary_block",false};
const StringName k_travel_minutes{"travel_minutes",false};
const StringName k_tree{"tree",false};
const StringName k_usable{"usable",false};
};
public:
// Whole builtin integer record operation. No retained sample values or time
// suppression. Unsupported data returns before any caller-owned mutation.
Dictionary performance_record_sample(Object *owner, const StringName &metric, int64_t duration) {
const StringName supported("supported",false), report_key("report",false);
Dictionary unsupported; unsupported[supported]=false;
Object *script=owner ? owner->get_script() : nullptr;
if (!script || String(script->get(StringName("resource_path",false))) != "res://scripts/core/performance_budget.gd" || metric==StringName() || duration<0) return unsupported;
const StringName samples_key("_samples",false), ordered_key("_ordered_samples",false), bytes_key("_ordered_sample_bytes",false), integer_key("_integer_window_bytes",false), totals_key("_totals",false), counts_key("_sample_counts",false), budgets_key("_budgets",false);
const Variant sv=owner->get(samples_key), ov=owner->get(ordered_key), bv=owner->get(bytes_key), iv=owner->get(integer_key), tv=owner->get(totals_key), cv=owner->get(counts_key), uv=owner->get(budgets_key), capacityv=owner->get(StringName("sample_capacity",false));
if (sv.get_type()!=Variant::DICTIONARY || ov.get_type()!=Variant::DICTIONARY || bv.get_type()!=Variant::DICTIONARY || iv.get_type()!=Variant::DICTIONARY || tv.get_type()!=Variant::DICTIONARY || cv.get_type()!=Variant::DICTIONARY || uv.get_type()!=Variant::DICTIONARY || capacityv.get_type()!=Variant::INT) return unsupported;
Dictionary samples=sv, orders=ov, rawbytes=bv, integers=iv, totals=tv, counts=cv, budgets=uv;
if (samples.is_read_only() || orders.is_read_only() || rawbytes.is_read_only() || integers.is_read_only() || totals.is_read_only() || counts.is_read_only()) return unsupported;
const std::array<Dictionary,7> maps{samples,orders,rawbytes,integers,totals,counts,budgets};
for (size_t i=0;i<maps.size();++i) for (size_t j=i+1;j<maps.size();++j)
if (UtilityFunctions::is_same(maps[i],maps[j])) return unsupported;
const bool existing=samples.has(metric);
Variant rawv=samples.get(metric,Array());
if (rawv.get_type()!=Variant::ARRAY) return unsupported;
Array values=rawv;
if (values.is_read_only()) return unsupported;
for (int64_t i=0;i<values.size();++i) if (values[i].get_type()!=Variant::INT) return unsupported;
Variant totalv=totals.get(metric,0), countv=counts.get(metric,0), budgetv=budgets.get(metric,Dictionary());
if (totalv.get_type()!=Variant::INT || countv.get_type()!=Variant::INT || budgetv.get_type()!=Variant::DICTIONARY) return unsupported;
Dictionary budget=budgetv;
for (const Dictionary &map: maps) if (UtilityFunctions::is_same(budget,map)) return unsupported;
const StringName aggregation_key("aggregation",false), limit_key("limit_us",false);
Variant aggregationv=budget.get(aggregation_key,1), limitv=budget.get(limit_key,0);
if (aggregationv.get_type()!=Variant::INT || limitv.get_type()!=Variant::INT) return unsupported;
// One exact byte snapshot serves both builtin validation helpers inside
// this call; there are no external calls between their original checks.
PackedByteArray before=UtilityFunctions::var_to_bytes(values);
TypedArray<int64_t> ordered;
Variant savedbytes=rawbytes.get(metric,PackedByteArray());
bool reuse=existing && orders.has(metric) && savedbytes.get_type()==Variant::PACKED_BYTE_ARRAY && PackedByteArray(savedbytes)==before;
if (reuse) {
Variant orderv=orders[metric];
if (orderv.get_type()!=Variant::ARRAY) return unsupported;
Array prior=orderv;
if (prior.is_read_only() || !prior.is_typed() || prior.get_typed_builtin()!=Variant::INT || prior.size()!=values.size()) return unsupported;
ordered=prior;
} else {
for (int64_t i=0;i<values.size();++i) ordered.append(values[i]);
ordered.sort();
}
// Guards completed: mutations preserve raw and reused ordered aliases.
if (!existing) samples[metric]=values;
integers[metric]=before;
if (!reuse) { orders[metric]=ordered; rawbytes[metric]=before; }
values.append(duration);
ordered.insert(ordered.bsearch(duration),duration);
if (values.size()>int64_t(capacityv)) {
Variant removed=values.pop_front();
ordered.remove_at(ordered.bsearch(removed));
}
PackedByteArray after=UtilityFunctions::var_to_bytes(values);
rawbytes[metric]=after; integers[metric]=after;
const int64_t lifetime_total=the_tree_native::signed_add(int64_t(totalv),duration);
const int64_t lifetime_count=the_tree_native::signed_add(int64_t(countv),1);
totals[metric]=lifetime_total; counts[metric]=lifetime_count;
const int64_t average=lifetime_count>0 ? lifetime_total/lifetime_count : 0;
const int64_t maximum=ordered.is_empty() ? 0 : std::max<int64_t>(0,int64_t(ordered[ordered.size()-1]));
int64_t p95=0;
if (!ordered.is_empty()) {
const int64_t index=std::max<int64_t>(the_tree_native::signed_add(the_tree_native::signed_add(signed_product(95,ordered.size()),99)/100,-1),0);
p95=ordered[std::min<int64_t>(index,ordered.size()-1)];
}
const int64_t aggregation=aggregationv, limit=limitv;
// Original default match is P95, including unknown aggregation values.
const int64_t measured=aggregation==0 ? average : (aggregation==2 ? maximum : p95);
Dictionary report;
report[StringName("metric_id",false)]=metric;
report[StringName("window_sample_count",false)]=values.size();
report[StringName("lifetime_sample_count",false)]=lifetime_count;
report[StringName("average_us",false)]=average;
report[StringName("p95_us",false)]=p95;
report[StringName("maximum_us",false)]=maximum;
report[aggregation_key]=aggregation;
report[StringName("measured_us",false)]=measured;
report[limit_key]=limit;
report[StringName("budget_exceeded",false)]=limit>0 && measured>limit;
Dictionary result; result[supported]=true; result[report_key]=report; return result;
}
#include "guest_candidate_batch.inc"
void clear_edge_cache() { cached_edges.clear(); }
Dictionary search(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider) {
return search_impl(cells, indices, start_index, goals, edge_provider, false);
}
Dictionary search_cached(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider) {
return search_impl(cells, indices, start_index, goals, edge_provider, true);
}
// One ordered projection, with no new persistent ownership/cache. Only
// builtin pure getters and the already guarded sole budget observer qualify.
Dictionary project_guest_candidates(Object *runtime, const StringName &guest_id,
int64_t open_state, int64_t degraded_state, int64_t movement_scale,
int64_t stair_credit, int64_t orthogonal_cost, const Callable &ticks) {
const ProjectionNames n;
Dictionary unsupported;
unsupported[n.k_supported] = false;
if (!builtin(n,runtime, "res://autoload/simulation_runtime.gd") || !ticks.is_valid()) return unsupported;
Object *path = runtime->get(n.k_path_service);
Object *elevators = runtime->get(n.k_elevators);
Object *facilities = runtime->get(n.k_facility_service);
Object *definitions = runtime->get(n.k_definition_registry);
Object *inventory = runtime->get(n.k_inventory_service);
Object *guests = runtime->get(n.k_guest_service);
if (!builtin(n,path,"res://scripts/world/path_service.gd") ||
!builtin(n,elevators,"res://scripts/transport/elevator_service.gd") ||
!builtin(n,facilities,"res://scripts/facility/facility_service.gd") ||
!builtin(n,definitions,"res://scripts/core/definition_registry.gd") ||
!builtin(n,inventory,"res://scripts/inventory/inventory_service.gd") ||
!builtin(n,guests,"res://scripts/guest/guest_service.gd") ||
!static_cast<bool>(runtime->call(n.k__guest_access_batch_can_select))) return unsupported;
Object *guest = guests->call(n.k_get_guest,guest_id);
Array candidates;
if (!guest) {
Dictionary result; result[n.k_supported] = true;
result[n.k_candidates] = candidates; return result;
}
if (!builtin(n,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
const Array initial = facilities->call(n.k_get_instances);
// Preflight is read-only: default registry/get_instances have no public
// error/counter effects. Custom resources retain the original whole loop.
for (int64_t i=0;i<initial.size();++i) {
Object *facility = initial[i];
if (!builtin(n,facility,"res://scripts/facility/facility_instance.gd")) return unsupported;
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
if (definition && !builtin(n,definition,"res://scripts/data/facility_definition.gd")) return unsupported;
}
Array goals;
for (int64_t i=0;i<initial.size();++i) goals.append_array(facility_access_cells(n,path,initial[i]));
const Vector3i start = guest->get(n.k_current_cell);
path->call(n.k_begin_guest_path_query_batch,start,goals);
const Array ordered = facilities->call(n.k_get_instances);
TypedArray<int64_t> layers; layers.push_back(0); layers.push_back(1);
TypedArray<StringName> access_ids;
for (int64_t i=0;i<ordered.size();++i) {
Object *facility = ordered[i];
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
if (!definition) continue;
const Array tags = definition->get(n.k_tags);
if (tags.has(n.k_staff_only)) continue;
if (tags.has(n.k_entrance) && static_cast<bool>(runtime->call(n.k__guest_has_checked_in,guest))) continue;
bool has_inputs = true;
const Dictionary inputs = definition->get(n.k_inventory_inputs);
const Array items = sorted_builtin_input_names(n,runtime,inputs);
for (int64_t j=0;j<items.size();++j) {
const int64_t quantity = inventory->call(n.k_available_quantity,facility->get(n.k_local_inventory_id),items[j]);
if (quantity < static_cast<int64_t>(inputs[items[j]])) {has_inputs=false;break;}
}
if (!has_inputs) {
Dictionary row;row[n.k_facility_id]=facility->get(n.k_instance_id);
row[n.k_inputs_available]=false;candidates.push_back(row);continue;
}
const Array destinations = facility_access_cells(n,path,facility);
Dictionary route = nearest_guest_access_impl(n,path,start,destinations,facility->get(n.k_origin),layers,access_ids,ticks);
if (static_cast<bool>(route.get(n.k_supported,false))) route.erase(n.k_supported);
else route = Dictionary(runtime->call(n.k__find_facility_access_path,start,facility));
const Array walk = route.get(n.k_path,Array());
const bool plain_tag_relief = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
const Dictionary relief = plain_tag_relief ? builtin_tag_relief(n,tags) :
Dictionary(runtime->call(n.k__need_relief_for_facility_tags,tags));
Dictionary row;
row[n.k_facility_id]=facility->get(n.k_instance_id);
row[n.k_facility_tags]=tags.duplicate();
const int64_t state = facility->get(n.k_state);
row[n.k_is_open]=(state==open_state || state==degraded_state);
row[n.k_reachable]=route.get(n.k_reachable,false);
row[n.k_travel_minutes]=guest_path_minutes(n,path,elevators,walk,movement_scale,stair_credit,orthogonal_cost);
const Array queue = facility->get(n.k_queue_entries);
const int64_t capacity = facility->get(n.k_capacity);
row[n.k_expected_wait]=signed_product(queue.size(),facility->get(n.k_base_service_minutes))/std::max<int64_t>(capacity,1);
row[n.k_estimated_total_gold]=runtime->call(n.k_get_facility_business_price,facility);
const int64_t quality = facility->get(n.k_base_quality);
row[n.k_expected_quality]=std::max<int64_t>(0,std::min<int64_t>(quality,100));
row[n.k_need_relief]=relief;
row[n.k_risk_level]=int64_t(0);row[n.k_illegal_level]=int64_t(0);
row[n.k_group_fit]=signed_product(std::min<int64_t>(capacity,4),5);
// Recheck at the original call position: preceding price/observer
// callbacks must retain a replaced/custom runtime's original call.
const bool plain_tag_category = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
row[n.k_service_category]=plain_tag_category ? Variant(builtin_tag_category(n,tags)) :
runtime->call(n.k__service_category_for_tags,tags);
Dictionary handle;handle[n.k_target_cell]=route.get(n.k_target_cell,guest->get(n.k_current_cell));
handle[n.k_graph_revision]=path->get(n.k_graph_revision);
row[n.k_path_handle]=handle;candidates.push_back(row);
}
path->call(n.k_end_guest_path_query_batch);
Dictionary result;result[n.k_supported]=true;result[n.k_candidates]=candidates;return result;
}
private:
// Direct translation of the two pure builtin tag methods. Fresh result,
// original insertion/branch order, no retained definition/tag memo.
static Dictionary builtin_tag_relief(const ProjectionNames &n,const Array &tags) {
Dictionary relief;
relief[n.k_tagproj_hunger]=int64_t(0);relief[n.k_tagproj_sleep]=int64_t(0);
relief[n.k_tagproj_hygiene]=int64_t(0);relief[n.k_tagproj_medical]=int64_t(0);
relief[n.k_tagproj_leisure]=int64_t(0);relief[n.k_tagproj_intimacy]=int64_t(0);
if(tags.has(n.k_tagproj_dining)) {relief[n.k_tagproj_hunger]=int64_t(80);relief[n.k_tagproj_leisure]=int64_t(10);}
if(tags.has(n.k_tagproj_lodging)) {relief[n.k_tagproj_sleep]=int64_t(90);relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),10);}
if(tags.has(n.k_tagproj_social)||tags.has(n.k_tagproj_leisure)) relief[n.k_tagproj_leisure]=std::max<int64_t>(int64_t(relief[n.k_tagproj_leisure]),40);
if(tags.has(n.k_tagproj_hygiene)||tags.has(n.k_tagproj_bath)) relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),80);
if(tags.has(n.k_tagproj_medical)) relief[n.k_tagproj_medical]=int64_t(90);
else if(tags.has(n.k_tagproj_wellness)) relief[n.k_tagproj_medical]=std::max<int64_t>(int64_t(relief[n.k_tagproj_medical]),20);
if(tags.has(n.k_tagproj_adult_only)||tags.has(n.k_tagproj_restricted_service)) relief[n.k_tagproj_intimacy]=int64_t(80);
return relief;
}
static StringName builtin_tag_category(const ProjectionNames &n,const Array &tags) {
if(tags.has(n.k_tagproj_dining))return n.k_tagproj_food;
if(tags.has(n.k_tagproj_lodging))return n.k_tagproj_lodging;
if(tags.has(n.k_tagproj_social))return n.k_tagproj_leisure;
return n.k_tagproj_service;
}
static bool builtin(const ProjectionNames &n,Object *object,const char *resource) {
if (!object) return false;Object *script=object->get_script();
return script && String(script->get(n.k_resource_path))==resource;
}
// Exact builtin cache-key spelling. No normalized/reordered profile and no
// persistent cache; String lengths count Unicode codepoints as GDScript does.
static String cache_key_suffix(const ProjectionNames &n,Object *path, const TypedArray<int64_t> &layers,
const TypedArray<StringName> &access) {
String layer_text, access_text;
for (int64_t i=0; i<layers.size(); ++i) {
if (i) layer_text += ",";
layer_text += String::num_int64(static_cast<int64_t>(layers[i]));
}
for (int64_t i=0; i<access.size(); ++i) {
if (i) access_text += ",";
const String value = String(static_cast<StringName>(access[i]));
access_text += String::num_int64(value.length()) + ":" + value;
}
return String("|L:") + layer_text + "|A:" + access_text + "|R:" +
String::num_int64(static_cast<int64_t>(path->get(n.k_graph_revision)));
}
static String cache_key_with_suffix(const Vector3i &start, const Vector3i &goal,
const String &suffix) {
return String::num_int64(start.x) + "," + String::num_int64(start.y) + "," +
String::num_int64(start.z) + ">" + String::num_int64(goal.x) + "," +
String::num_int64(goal.y) + "," + String::num_int64(goal.z) + suffix;
}
static int64_t signed_product(int64_t a,int64_t b) {
const uint64_t product=static_cast<uint64_t>(a)*static_cast<uint64_t>(b);
if (product<=static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) return static_cast<int64_t>(product);
return std::numeric_limits<int64_t>::min()+static_cast<int64_t>(product-(uint64_t(1)<<63));
}
static Array facility_access_cells(const ProjectionNames &n,Object *path,Object *facility) {
const Dictionary passable=path->get(n.k__passable_cells);
Array occupied=Array(facility->get(n.k_occupied_cells)).duplicate();
if (occupied.is_empty()) occupied.push_back(facility->get(n.k_origin));
Dictionary unique;
for (int64_t i=0;i<occupied.size();++i) {
const Vector3i cell=occupied[i];
for (int32_t dx : {-1,1}) {
// Match GDScript's Vector3i conversion after int64 addition.
const Vector3i candidate(int64_t(cell.x)+dx,cell.y,cell.z);
if (passable.has(candidate)) unique[candidate]=true;
}
}
const Vector3i origin=facility->get(n.k_origin);if(passable.has(origin)) unique[origin]=true;
const Array keys=unique.keys();std::vector<Vector3i> sorted;sorted.reserve(keys.size());
for (int64_t i=0;i<keys.size();++i) sorted.push_back(keys[i]);
std::sort(sorted.begin(),sorted.end(),[](const Vector3i &a,const Vector3i &b){
if(a.z!=b.z)return a.z<b.z;if(a.y!=b.y)return a.y<b.y;return a.x<b.x;
});
Array result;for(const Vector3i &cell:sorted)result.push_back(cell);return result;
}
static int64_t guest_path_minutes(const ProjectionNames &n,Object *path,Object *elevators,const Array &route,
int64_t movement_scale,int64_t stair_credit,int64_t orthogonal_cost) {
Dictionary memo=path->get(n.k__guest_step_connector_memo);
// Route-local only. Reuse an ownership result only after an actual
// BOOL return and a typed cached step; no script callback occurs on a
// repeated typed memo hit. A miss/conversion/custom script keeps calls.
const bool builtin_pair = builtin(n,path,"res://scripts/world/path_service.gd") &&
builtin(n,elevators,"res://scripts/transport/elevator_service.gd");
bool ownership_valid = false;
bool ownership_value = false;
StringName ownership_connector;
for(int64_t i=1;i<route.size();++i) {
const Vector3i from=route[i-1],to=route[i];
const Dictionary destinations=memo.get(from,Dictionary());
StringName connector;
const bool memo_hit = destinations.has(to);
const bool typed_memo_hit = memo_hit && destinations[to].get_type() == Variant::STRING_NAME;
if(memo_hit)connector=destinations[to];
else {TypedArray<StringName> access;connector=path->call(n.k_get_step_connector,from,to,access);}
bool special;
if (builtin_pair && typed_memo_hit && ownership_valid && connector == ownership_connector) {
special = ownership_value;
} else {
const Variant owned = elevators->call(n.k_owns_connector,connector);
special = static_cast<bool>(owned);
ownership_valid = builtin_pair && typed_memo_hit && owned.get_type() == Variant::BOOL;
ownership_value = special;
ownership_connector = connector;
}
if(!special && String(connector).begins_with("infra.connector:") && from.x==to.x && from.z==to.z &&
std::abs(int64_t(from.y)-int64_t(to.y))==1) {
const Dictionary detail=path->call(n.k_get_connector,connector);
special=detail.get(n.k_movement_type,StringName())==Variant(n.k_CONNECTOR) &&
static_cast<int64_t>(detail.get(n.k_cost,int64_t(0)))==150 && stair_credit>movement_scale;
}
if(special) {
const int64_t cost=path->call(n.k_calculate_guest_batch_path_cost,route[0],route[route.size()-1],route);
return static_cast<int64_t>(std::ceil(static_cast<double>(cost)/static_cast<double>(orthogonal_cost)));
}
}
return std::max<int64_t>(route.size()-1,0);
}
public:
// Stateless translation of the builtin nearest access query. The caller
// supplies the existing typed default profile and the real Time callable.
// Public cache publication, failure diagnostics and fallback stay ordered.
Dictionary nearest_guest_access(Object *path, const Vector3i &start,
const Array &goals, const Vector3i &fallback_target,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
const Callable &ticks) {
const ProjectionNames n;
return nearest_guest_access_impl(n,path,start,goals,fallback_target,layers,access,ticks);
}
private:
Dictionary nearest_guest_access_impl(const ProjectionNames &n,Object *path, const Vector3i &start,
const Array &goals, const Vector3i &fallback_target,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
const Callable &ticks) {
Dictionary unsupported;
unsupported[n.k_supported] = false;
if (!path || !ticks.is_valid() || goals.is_empty()) return unsupported;
Object *script = path->get_script();
if (!script || String(script->get(n.k_resource_path)) != "res://scripts/world/path_service.gd") return unsupported;
Dictionary batch = path->get(n.k__query_batch);
if (batch.is_empty() || start != static_cast<Vector3i>(batch[n.k_start])) return unsupported;
const Dictionary passable = path->get(n.k__passable_cells);
if (!passable.has(start) || blocked(n,path, start) || !layers.has(start.z)) return unsupported;
const Dictionary targets = batch[n.k_targets];
Dictionary cache = path->get(n.k__path_cache);
// Exact builtin validation loop has no callback before ticks.call().
// Build the unchanged profile/revision suffix lazily at the first key.
String key_suffix;
bool key_suffix_ready = false;
for (int64_t j = 0; j < goals.size(); ++j) {
if (goals[j].get_type() != Variant::VECTOR3I) return unsupported;
const Vector3i cell = goals[j];
if (!targets.has(cell)) {
const bool searchable = passable.has(cell) && layers.has(cell.z) && !blocked(n,path, cell);
if (searchable && (start.z == cell.z || static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, cell, layers, access)))) return unsupported;
}
if (!key_suffix_ready) {
key_suffix = cache_key_suffix(n,path, layers, access);
key_suffix_ready = true;
}
const String key = cache_key_with_suffix(start, cell, key_suffix);
if (cache.has(key)) return unsupported;
}
const int64_t started = ticks.call();
if (!static_cast<bool>(batch[n.k_ready])) {
batch[n.k_tree] = path->call(n.k__build_guest_query_tree_compact, start, targets, layers, access);
batch[n.k_arithmetic_wrapped] = path->get(n.k__guest_tree_arithmetic_wrapped);
batch[n.k_ready] = true;
}
const Dictionary tree = batch[n.k_tree];
if (!static_cast<bool>(tree.get(n.k_usable, false)) || static_cast<bool>(batch.get(n.k_arithmetic_wrapped, false))) return unsupported;
Vector3i best_cell = fallback_target;
bool found = false;
int64_t best_cost = 0;
const Dictionary settled = tree[n.k_settled];
bool cost_view_ready=false,compact_cost_view=false;
Dictionary cost_indices,cost_dictionary;
PackedInt64Array cost_values;
for (int64_t j = 0; j < goals.size(); ++j) {
const Vector3i cell = goals[j];
if (!targets.has(cell) || !settled.has(cell)) continue;
// No callback occurs between these original numeric cost reads.
// Initialize lazily at the first eligible goal, and retain nothing
// past this call or reuse after the subsequent route callbacks.
if (!cost_view_ready) {
compact_cost_view=tree.get(n.k_compact,false);
if(compact_cost_view) {cost_indices=tree[n.k_indices];cost_values=tree[n.k_cost_values];}
else cost_dictionary=tree[n.k_costs];
cost_view_ready=true;
}
int64_t cost=0;
if(compact_cost_view) {
if(!cost_indices.has(cell)) return unsupported;
const int64_t index=cost_indices[cell];
if(index<0 || index>=cost_values.size()) return unsupported;
cost=cost_values[index];
} else {
if(!cost_dictionary.has(cell)) return unsupported;
cost=cost_dictionary[cell];
}
if (!found || cost < best_cost) {
found = true;
best_cost = cost;
best_cell = cell;
}
}
TypedArray<Vector3i> best_path;
if (found) {
best_path = resolve_ready_guest_point(n,path, start, best_cell, tree, layers, access);
if (best_path.is_empty()) return unsupported;
}
if (!goals.is_empty() && (!found || goals[goals.size() - 1] != Variant(best_cell))) {
resolve_ready_guest_point(n,path, start, goals[goals.size() - 1], tree, layers, access);
}
const int64_t elapsed = the_tree_native::signed_add(static_cast<int64_t>(ticks.call()), the_tree_native::signed_add(~started, 1));
path->emit_signal(n.k_path_query_measured, std::max<int64_t>(elapsed, 0));
Dictionary result;
result[n.k_supported] = true;
result[n.k_reachable] = found;
result[n.k_path] = best_path;
result[n.k_target_cell] = best_cell;
return result;
}
private:
// Only StringName keys qualify. Conversion-sensitive and custom runtime
// cases retain the original script sorter. No owner values are retained.
static Array sorted_builtin_input_names(const ProjectionNames &n,Object *runtime,const Dictionary &inputs) {
auto original=[&]() -> Array {return runtime->call(n.k__sorted_name_keys,inputs);};
if(!builtin(n,runtime,"res://autoload/simulation_runtime.gd")) return original();
const Array keys=inputs.keys();
for(int64_t i=0;i<keys.size();++i)
if(keys[i].get_type()!=Variant::STRING_NAME) return original();
// New standard-library allocation remains behind the same pure fallback.
// Nothing caller-owned changes before this block completes.
try {
std::vector<std::pair<String,StringName>> rows;
rows.reserve(keys.size());
for(int64_t i=0;i<keys.size();++i) {
const StringName name=keys[i];rows.emplace_back(String(name),name);
}
// String ordering is the same engine operator used by the script.
std::sort(rows.begin(),rows.end(),[](const auto &a,const auto &b){return a.first<b.first;});
TypedArray<StringName> result;
for(const auto &row:rows) result.push_back(row.second);
return result;
} catch(const std::bad_alloc &) {return original();}
catch(const std::length_error &) {return original();}
}
// Fresh writable typed output, matching the builtin append loop. Check
// the script at this original call position, after any route callbacks.
static Variant copy_builtin_guest_route(const ProjectionNames &n,Object *path,const TypedArray<Vector3i> &route) {
if(!builtin(n,path,"res://scripts/world/path_service.gd")) return path->call(n.k__copy_path,route);
TypedArray<Vector3i> copied;
for(int64_t i=0;i<route.size();++i) copied.push_back(route[i]);
return copied;
}
static bool blocked(const ProjectionNames &n,Object *path, const Vector3i &cell) {
const Dictionary traffic_map = path->get(n.k__cell_traffic);
const Dictionary traffic = traffic_map.get(cell, Dictionary());
return !traffic.is_empty() && static_cast<bool>(traffic[n.k_temporary_block]);
}
static bool tree_has_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
const Dictionary values = tree[n.k_costs];
return values.has(cell);
}
const Dictionary indices = tree[n.k_indices];
if (!indices.has(cell)) return false;
const int64_t index = indices[cell];
const PackedInt64Array values = tree[n.k_cost_values];
return index >= 0 && index < values.size();
}
static int64_t tree_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
const Dictionary values = tree[n.k_costs];
return static_cast<int64_t>(values[cell]);
}
const Dictionary indices = tree[n.k_indices];
const PackedInt64Array values = tree[n.k_cost_values];
return values[static_cast<int64_t>(indices[cell])];
}
static TypedArray<Vector3i> resolve_ready_guest_point(const ProjectionNames &n,Object *path,
const Vector3i &start, const Vector3i &goal, const Dictionary &tree,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access) {
const Dictionary passable = path->get(n.k__passable_cells);
if (!passable.has(start)) return path->call(n.k__route_failure, n.k_START_NOT_PASSABLE);
if (!passable.has(goal)) return path->call(n.k__route_failure, n.k_GOAL_NOT_PASSABLE);
if (!layers.has(start.z) || !layers.has(goal.z)) return path->call(n.k__route_failure, n.k_ACCESS_LAYER_DENIED);
if (blocked(n,path, start)) return path->call(n.k__route_failure, n.k_START_TEMPORARILY_BLOCKED);
if (blocked(n,path, goal)) return path->call(n.k__route_failure, n.k_GOAL_TEMPORARILY_BLOCKED);
// ticks/tree callbacks may have changed the script or revision. Recheck
// at this original call position and never reuse the pre-tick suffix.
const String key = builtin(n,path,"res://scripts/world/path_service.gd") ?
cache_key_with_suffix(start, goal, cache_key_suffix(n,path, layers, access)) :
String(path->call(n.k__cache_key, start, goal, layers, access));
Dictionary cache = path->get(n.k__path_cache);
const Dictionary batch = path->get(n.k__query_batch);
const Dictionary targets = batch[n.k_targets];
if (cache.has(key) || !targets.has(goal)) return path->call(n.k__find_path_internal, start, goal);
path->set(n.k_cache_misses, the_tree_native::signed_add(static_cast<int64_t>(path->get(n.k_cache_misses)), 1));
if (start.z != goal.z && !static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, goal, layers, access))) return path->call(n.k__route_failure, n.k_GOAL_UNREACHABLE);
TypedArray<Vector3i> route;
const Dictionary settled = tree[n.k_settled];
if (start == goal) route.push_back(start);
else if (settled.has(goal)) route = Array(path->call(n.k__guest_tree_reconstruct_path, tree, goal));
if (route.is_empty()) return path->call(n.k__route_failure, path->call(n.k__diagnose_no_route_reason, start, goal, layers, access));
cache[key] = copy_builtin_guest_route(n,path,route);
path->set(n.k_last_no_route_reason, n.k_OK);
path->set(n.k_last_path_cost, tree_cost(n,tree, goal));
path->set(n.k_last_error, String(""));
return route;
}
public:
private:
// One existing builtin provider operation, with no new value cache. Only
// connector-free WALK rows qualify; unsupported cases call the old provider.
// All work stays private until the original final shared[current] assignment.
struct WalkEdgeNames {
const StringName resource_path{"resource_path",false}, constants_method{"get_script_constant_map",false};
const StringName front{"FRONT",false}, back{"BACK",false}, walk{"MOVEMENT_WALK",false};
const StringName base{"ORTHOGONAL_MOVE_COST",false}, congestion{"CONGESTION_COST_PER_EXCESS",false};
const StringName workspace{"_guest_tree_workspace",false}, edges{"edges",false}, indices{"indices",false};
const StringName adjacency{"_adjacency",false}, traffic{"_cell_traffic",false}, vertical{"_vertical_walk_requires_connector",false};
const StringName to{"to",false}, connector{"connector_id",false}, access{"access_id",false}, movement{"movement_type",false};
const StringName base_cost{"base_cost",false}, cost{"cost",false}, temporary{"temporary_block",false};
const StringName dynamic{"dynamic_cost",false}, density{"current_density",false}, capacity{"base_capacity",false};
const StringName provider{"_guest_tree_shared_edges",false};
};
struct WalkEdgeContext {
Object *path=nullptr;
int64_t front=0, back=0, base=0, congestion=0;
StringName walk;
};
static bool walk_edge_context(const WalkEdgeNames &n,Object *path,const Array &layers,
const Array &access,WalkEdgeContext &context) {
if (!path || layers.size()!=2 || !access.is_empty() ||
layers[0].get_type()!=Variant::INT || layers[1].get_type()!=Variant::INT) return false;
Object *script=path->get_script();
if (!script || String(script->get(n.resource_path))!="res://scripts/world/path_service.gd" ||
!script->has_method(n.constants_method)) return false;
const Variant value=script->call(n.constants_method);
if (value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary constants=value;
for (const StringName &key : {n.front,n.back,n.base,n.congestion})
if (constants.get(key,Variant()).get_type()!=Variant::INT) return false;
if (constants.get(n.walk,Variant()).get_type()!=Variant::STRING_NAME ||
int64_t(layers[0])!=int64_t(constants[n.front]) ||
int64_t(layers[1])!=int64_t(constants[n.back])) return false;
context.path=path;context.front=constants[n.front];context.back=constants[n.back];
context.base=constants[n.base];context.congestion=constants[n.congestion];context.walk=constants[n.walk];
return true;
}
static bool builtin_walk_edge_rows(const WalkEdgeNames &n,const WalkEdgeContext &context,
const Vector3i &current,Array &rows) {
if (!context.path) return false;
const Variant workspace_value=context.path->get(n.workspace);
if (workspace_value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary workspace=workspace_value;
const Variant shared_value=workspace.get(n.edges,Variant());
if (shared_value.get_type()!=Variant::DICTIONARY) return false;
Dictionary shared=shared_value;
// Original cached-row branch precedes readonly and all other state reads.
if (shared.has(current)) {
const Variant cached=shared[current];
if (cached.get_type()!=Variant::ARRAY) return false;
rows=cached;return true;
}
if (shared.is_read_only()) return false;
const Variant indices_value=workspace.get(n.indices,Variant()), adjacency_value=context.path->get(n.adjacency);
const Variant traffic_value=context.path->get(n.traffic), vertical_value=context.path->get(n.vertical);
if (indices_value.get_type()!=Variant::DICTIONARY || adjacency_value.get_type()!=Variant::DICTIONARY ||
traffic_value.get_type()!=Variant::DICTIONARY || vertical_value.get_type()!=Variant::BOOL) return false;
const Dictionary indices=indices_value, adjacency=adjacency_value, traffic=traffic_value;
const Variant raw_value=adjacency.get(current,Array());
if (raw_value.get_type()!=Variant::ARRAY) return false;
const Array raw=raw_value;Array result;
for (int64_t i=0;i<raw.size();++i) {
if (raw[i].get_type()!=Variant::DICTIONARY) return false;
const Dictionary edge=raw[i];
if (edge.get(n.to,Variant()).get_type()!=Variant::VECTOR3I) return false;
const Vector3i neighbor=edge[n.to];
if (neighbor.z!=context.front && neighbor.z!=context.back) continue;
const Variant row_value=traffic.get(neighbor,Dictionary());
if (row_value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary row=row_value;
if (!row.is_empty()) {
if (row.get(n.temporary,Variant()).get_type()!=Variant::BOOL) return false;
if (bool(row[n.temporary])) continue;
}
// Preserve old method for every connector/access/other movement row.
if (edge.get(n.connector,Variant()).get_type()!=Variant::STRING_NAME ||
edge.get(n.access,Variant()).get_type()!=Variant::STRING_NAME ||
edge.get(n.movement,Variant()).get_type()!=Variant::STRING_NAME) return false;
const StringName connector=edge[n.connector], access=edge[n.access], movement=edge[n.movement];
if (!connector.is_empty() || !access.is_empty() || movement!=context.walk) return false;
if (bool(vertical_value) && current.y!=neighbor.y) continue;
const Variant base=edge.get(n.base_cost,edge.get(n.cost,context.base));
if (base.get_type()!=Variant::INT) return false;
int64_t dynamic=0;
if (!row.is_empty()) {
for (const StringName &key : {n.dynamic,n.density,n.capacity})
if (row.get(key,Variant()).get_type()!=Variant::INT) return false;
const int64_t excess=the_tree_native::signed_add(int64_t(row[n.density]),
the_tree_native::signed_add(~int64_t(row[n.capacity]),1));
dynamic=the_tree_native::signed_add(int64_t(row[n.dynamic]),
signed_product(excess>0?excess:0,context.congestion));
}
const int64_t cost=the_tree_native::signed_add(int64_t(base),dynamic);
Array pair;pair.push_back(neighbor);pair.push_back(cost);result.push_back(pair);
// Same short circuit and first invalid prefix as the original method.
if (cost<=0 || !indices.has(neighbor)) break;
}
shared[current]=result;rows=result;return true;
}
public:
Dictionary guest_tree_edge_rows(Object *path,const Vector3i &current,const Array &layers,const Array &access) {
const WalkEdgeNames names;WalkEdgeContext context;Array rows;
Dictionary result;const StringName supported{"supported",false}, row_key{"rows",false};
result[supported]=false;
if (!walk_edge_context(names,path,layers,access,context) ||
!builtin_walk_edge_rows(names,context,current,rows)) return result;
result[supported]=true;result[row_key]=rows;return result;
}
private:
Dictionary search_impl(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider, bool use_edge_cache) {
Dictionary output;
output[StringName("status")] = String("unusable");
if (start_index < 0 || start_index >= cells.size() || !edge_provider.is_valid()) return output;
try {
std::vector<I> goal_indices;
const Array goal_keys = goals.keys();
for (I j = 0; j < goal_keys.size(); ++j)
goal_indices.push_back(static_cast<I>(indices.get(goal_keys[j], I(-1))));
Array arguments;
arguments.resize(1);
const WalkEdgeNames walk_names;WalkEdgeContext walk_context;
if (edge_provider.get_method()==walk_names.provider && edge_provider.get_argument_count()==1 &&
edge_provider.get_bound_arguments_count()==2 && edge_provider.get_unbound_arguments_count()==0) {
const Array bound=edge_provider.get_bound_arguments();
if (bound.size()==2 && bound[0].get_type()==Variant::ARRAY && bound[1].get_type()==Variant::ARRAY)
walk_edge_context(walk_names,edge_provider.get_object(),bound[0],bound[1],walk_context);
}
// Call the original bound Godot edge method only when the search expands a node.
// Preserve its lazy cache population, filter ordering and first invalid row.
auto original_edges = [&](I current) {
arguments[0] = cells[current];
Array fused;bool fused_supported=false;
if (cells[current].get_type()==Variant::VECTOR3I) {
const Vector3i cell=cells[current];
fused_supported=builtin_walk_edge_rows(walk_names,walk_context,cell,fused);
}
const Variant value = fused_supported ? Variant(fused) : edge_provider.callv(arguments);
if (value.get_type() != Variant::ARRAY) return std::vector<Edge>{{-1, 0}};
const Array rows = value;
std::vector<Edge> result;
result.reserve(rows.size());
for (I j = 0; j < rows.size(); ++j) {
if (rows[j].get_type() != Variant::ARRAY) { result.push_back({-1, 0}); break; }
const Array row = rows[j];
if (row.size() != 2 || row[1].get_type() != Variant::INT) {
result.push_back({-1, 0}); break;
}
const I cost = static_cast<I>(row[1]);
// Nonpositive cost is rejected before requesting the neighbor index.
if (cost <= 0) { result.push_back({-1, cost}); break; }
const I neighbor = static_cast<I>(indices.get(row[0], I(-1)));
result.push_back({neighbor, cost});
if (neighbor < 0) break;
}
return result;
};
// Borrow cached rows only during the pure numeric edge loop.
// No engine callback runs while that borrowed vector is traversed.
std::vector<Edge> converted;
auto edges = [&](I current) -> const std::vector<Edge>& {
if (use_edge_cache) {
const auto found = cached_edges.find(current);
if (found != cached_edges.end()) return found->second;
}
converted = original_edges(current);
// Preserve the returned conversion even if a reentrant provider
// populated this cache key first. Never substitute its row here.
if (use_edge_cache) cached_edges.emplace(current, converted);
return converted;
};
const auto result = the_tree_native::search(cells.size(), start_index, goal_indices, edges);
output[StringName("status")] = String(result.status.c_str());
if (result.status != "usable") return output;
PackedInt64Array costs, parents;
if (costs.resize(result.costs.size()) != OK || parents.resize(result.parents.size()) != OK) {
output[StringName("status")] = String("unusable");
return output;
}
// Newly resized, private packed arrays own their writable storage.
// A provider may shrink caller cells. Preserve the old written
// prefix and resize-created zero tail, not the whole native vector.
const I written_count=cells.size();
if(written_count<=static_cast<I>(result.costs.size())) {
std::copy_n(result.costs.begin(),written_count,costs.ptrw());
std::copy_n(result.parents.begin(),written_count,parents.ptrw());
} else {
// Keep the original unsupported-growth path unchanged.
for (I j=0;j<cells.size();++j) {costs.set(j,result.costs[j]);parents.set(j,result.parents[j]);}
}
TypedArray<int64_t> discovered, parent_discovered;
for (I j : result.discovered) discovered.push_back(j);
for (I j : result.parent_discovered) parent_discovered.push_back(j);
Dictionary settled;
for (I j : result.settled) settled[cells[j]] = true;
output[StringName("cost_values")] = costs;
output[StringName("parent_indices")] = parents;
output[StringName("discovered")] = discovered;
output[StringName("parent_discovered")] = parent_discovered;
output[StringName("settled")] = settled;
return output;
} catch (const std::exception &) {
output = Dictionary();
output[StringName("status")] = String("unusable");
return output;
}
}
};
void initialize_tree_numeric_core(ModuleInitializationLevel level) {
if (level == MODULE_INITIALIZATION_LEVEL_SCENE) GDREGISTER_CLASS(TheTreeNumericCore);
}
void uninitialize_tree_numeric_core(ModuleInitializationLevel) {}
extern "C" {
GDExtensionBool GDE_EXPORT tree_numeric_core_init(GDExtensionInterfaceGetProcAddress get_proc,
GDExtensionClassLibraryPtr library, GDExtensionInitialization *initialization) {
GDExtensionBinding::InitObject init(get_proc, library, initialization);
init.register_initializer(initialize_tree_numeric_core);
init.register_terminator(uninitialize_tree_numeric_core);
init.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
return init.init();
}
}
@@ -0,0 +1,888 @@
// Isolated, uncompiled bridge prototype. No production registration or integration yet.
#include "tree_core.hpp"
#include <cmath>
#include <array>
#include <new>
#include <godot_cpp/templates/sort_array.hpp>
#include <godot_cpp/classes/ref_counted.hpp>
#include <godot_cpp/classes/object.hpp>
#include <godot_cpp/variant/vector3i.hpp>
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/godot.hpp>
#include <godot_cpp/variant/array.hpp>
#include <godot_cpp/variant/callable.hpp>
#include <godot_cpp/variant/dictionary.hpp>
#include <godot_cpp/variant/packed_int64_array.hpp>
#include <godot_cpp/variant/typed_array.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
using namespace godot;
using the_tree_native::I;
using the_tree_native::Edge;
class TheTreeNumericCore : public RefCounted {
GDCLASS(TheTreeNumericCore, RefCounted)
protected:
static void _bind_methods() {
ClassDB::bind_method(D_METHOD("performance_record_sample", "owner", "metric_id", "duration_us"), &TheTreeNumericCore::performance_record_sample);
ClassDB::bind_method(D_METHOD("guest_candidate_batch", "owner", "guest_id", "facilities", "context"), &TheTreeNumericCore::guest_candidate_batch);
ClassDB::bind_method(D_METHOD("guest_tree_edge_rows", "path", "current", "layers", "access"), &TheTreeNumericCore::guest_tree_edge_rows);
ClassDB::bind_method(D_METHOD("search", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search);
ClassDB::bind_method(D_METHOD("search_cached", "cells", "indices", "start_index", "goals", "edge_provider"), &TheTreeNumericCore::search_cached);
ClassDB::bind_method(D_METHOD("clear_edge_cache"), &TheTreeNumericCore::clear_edge_cache);
ClassDB::bind_method(D_METHOD("nearest_guest_access", "path", "start", "goals", "fallback_target", "layers", "access", "ticks"), &TheTreeNumericCore::nearest_guest_access);
ClassDB::bind_method(D_METHOD("project_guest_candidates", "runtime", "guest_id", "open_state", "degraded_state", "movement_scale", "stair_credit", "orthogonal_cost", "ticks"), &TheTreeNumericCore::project_guest_candidates);
}
private:
// Cache belongs to this instance and one caller-owned graph workspace.
// No reuse after cells, indices, filters or edge values change: the caller
// must clear it or release this core. The original search never uses it.
std::map<I, std::vector<Edge>> cached_edges;
// Per-public-call immutable names. No static/global lifetime, cached
// object values, script dispatch result or profile; recursive calls own
// separate scopes. Destruction precedes leaving the engine call.
struct ProjectionNames {
const StringName k_ACCESS_LAYER_DENIED{"ACCESS_LAYER_DENIED",false};
const StringName k_CONNECTOR{"CONNECTOR",false};
const StringName k_GOAL_NOT_PASSABLE{"GOAL_NOT_PASSABLE",false};
const StringName k_GOAL_TEMPORARILY_BLOCKED{"GOAL_TEMPORARILY_BLOCKED",false};
const StringName k_GOAL_UNREACHABLE{"GOAL_UNREACHABLE",false};
const StringName k_OK{"OK",false};
const StringName k_START_NOT_PASSABLE{"START_NOT_PASSABLE",false};
const StringName k_START_TEMPORARILY_BLOCKED{"START_TEMPORARILY_BLOCKED",false};
const StringName k__build_guest_query_tree_compact{"_build_guest_query_tree_compact",false};
const StringName k__cache_key{"_cache_key",false};
const StringName k__cell_traffic{"_cell_traffic",false};
const StringName k__copy_path{"_copy_path",false};
const StringName k__diagnose_no_route_reason{"_diagnose_no_route_reason",false};
const StringName k__find_facility_access_path{"_find_facility_access_path",false};
const StringName k__find_path_internal{"_find_path_internal",false};
const StringName k__guest_access_batch_can_select{"_guest_access_batch_can_select",false};
const StringName k__guest_batch_has_permitted_layer_crossing{"_guest_batch_has_permitted_layer_crossing",false};
const StringName k__guest_has_checked_in{"_guest_has_checked_in",false};
const StringName k__guest_step_connector_memo{"_guest_step_connector_memo",false};
const StringName k__guest_tree_arithmetic_wrapped{"_guest_tree_arithmetic_wrapped",false};
const StringName k__guest_tree_reconstruct_path{"_guest_tree_reconstruct_path",false};
const StringName k__need_relief_for_facility_tags{"_need_relief_for_facility_tags",false};
const StringName k__passable_cells{"_passable_cells",false};
const StringName k__path_cache{"_path_cache",false};
const StringName k__query_batch{"_query_batch",false};
const StringName k__route_failure{"_route_failure",false};
const StringName k__service_category_for_tags{"_service_category_for_tags",false};
const StringName k__sorted_name_keys{"_sorted_name_keys",false};
const StringName k_arithmetic_wrapped{"arithmetic_wrapped",false};
const StringName k_available_quantity{"available_quantity",false};
const StringName k_base_quality{"base_quality",false};
const StringName k_base_service_minutes{"base_service_minutes",false};
const StringName k_begin_guest_path_query_batch{"begin_guest_path_query_batch",false};
const StringName k_cache_misses{"cache_misses",false};
const StringName k_calculate_guest_batch_path_cost{"calculate_guest_batch_path_cost",false};
const StringName k_candidates{"candidates",false};
const StringName k_capacity{"capacity",false};
const StringName k_compact{"compact",false};
const StringName k_cost{"cost",false};
const StringName k_cost_values{"cost_values",false};
const StringName k_costs{"costs",false};
const StringName k_current_cell{"current_cell",false};
const StringName k_definition_id{"definition_id",false};
const StringName k_definition_registry{"definition_registry",false};
const StringName k_elevators{"elevators",false};
const StringName k_end_guest_path_query_batch{"end_guest_path_query_batch",false};
const StringName k_entrance{"entrance",false};
const StringName k_estimated_total_gold{"estimated_total_gold",false};
const StringName k_expected_quality{"expected_quality",false};
const StringName k_expected_wait{"expected_wait",false};
const StringName k_facility_id{"facility_id",false};
const StringName k_facility_service{"facility_service",false};
const StringName k_facility_tags{"facility_tags",false};
const StringName k_get_connector{"get_connector",false};
const StringName k_get_facility{"get_facility",false};
const StringName k_get_facility_business_price{"get_facility_business_price",false};
const StringName k_get_guest{"get_guest",false};
const StringName k_get_instances{"get_instances",false};
const StringName k_get_step_connector{"get_step_connector",false};
const StringName k_graph_revision{"graph_revision",false};
const StringName k_group_fit{"group_fit",false};
const StringName k_guest_service{"guest_service",false};
const StringName k_illegal_level{"illegal_level",false};
const StringName k_indices{"indices",false};
const StringName k_inputs_available{"inputs_available",false};
const StringName k_instance_id{"instance_id",false};
const StringName k_inventory_inputs{"inventory_inputs",false};
const StringName k_inventory_service{"inventory_service",false};
const StringName k_is_open{"is_open",false};
const StringName k_last_error{"last_error",false};
const StringName k_last_no_route_reason{"last_no_route_reason",false};
const StringName k_last_path_cost{"last_path_cost",false};
const StringName k_local_inventory_id{"local_inventory_id",false};
const StringName k_movement_type{"movement_type",false};
const StringName k_need_relief{"need_relief",false};
const StringName k_occupied_cells{"occupied_cells",false};
const StringName k_origin{"origin",false};
const StringName k_owns_connector{"owns_connector",false};
const StringName k_path{"path",false};
const StringName k_path_handle{"path_handle",false};
const StringName k_path_query_measured{"path_query_measured",false};
const StringName k_path_service{"path_service",false};
const StringName k_queue_entries{"queue_entries",false};
const StringName k_reachable{"reachable",false};
const StringName k_ready{"ready",false};
const StringName k_resource_path{"resource_path",false};
const StringName k_risk_level{"risk_level",false};
const StringName k_service_category{"service_category",false};
const StringName k_settled{"settled",false};
const StringName k_staff_only{"staff_only",false};
const StringName k_start{"start",false};
const StringName k_state{"state",false};
const StringName k_supported{"supported",false};
const StringName k_tags{"tags",false};
const StringName k_tagproj_hunger{"hunger",false};
const StringName k_tagproj_sleep{"sleep",false};
const StringName k_tagproj_hygiene{"hygiene",false};
const StringName k_tagproj_medical{"medical",false};
const StringName k_tagproj_leisure{"leisure",false};
const StringName k_tagproj_intimacy{"intimacy",false};
const StringName k_tagproj_dining{"dining",false};
const StringName k_tagproj_lodging{"lodging",false};
const StringName k_tagproj_social{"social",false};
const StringName k_tagproj_bath{"bath",false};
const StringName k_tagproj_wellness{"wellness",false};
const StringName k_tagproj_adult_only{"adult_only",false};
const StringName k_tagproj_restricted_service{"restricted_service",false};
const StringName k_tagproj_food{"food",false};
const StringName k_tagproj_service{"service",false};
const StringName k_target_cell{"target_cell",false};
const StringName k_targets{"targets",false};
const StringName k_temporary_block{"temporary_block",false};
const StringName k_travel_minutes{"travel_minutes",false};
const StringName k_tree{"tree",false};
const StringName k_usable{"usable",false};
};
public:
// Whole builtin integer record operation. No retained sample values or time
// suppression. Unsupported data returns before any caller-owned mutation.
Dictionary performance_record_sample(Object *owner, const StringName &metric, int64_t duration) {
const StringName supported("supported",false), report_key("report",false);
Dictionary unsupported; unsupported[supported]=false;
Object *script=owner ? owner->get_script() : nullptr;
if (!script || String(script->get(StringName("resource_path",false))) != "res://scripts/core/performance_budget.gd" || metric==StringName() || duration<0) return unsupported;
const StringName samples_key("_samples",false), ordered_key("_ordered_samples",false), bytes_key("_ordered_sample_bytes",false), integer_key("_integer_window_bytes",false), totals_key("_totals",false), counts_key("_sample_counts",false), budgets_key("_budgets",false);
const Variant sv=owner->get(samples_key), ov=owner->get(ordered_key), bv=owner->get(bytes_key), iv=owner->get(integer_key), tv=owner->get(totals_key), cv=owner->get(counts_key), uv=owner->get(budgets_key), capacityv=owner->get(StringName("sample_capacity",false));
if (sv.get_type()!=Variant::DICTIONARY || ov.get_type()!=Variant::DICTIONARY || bv.get_type()!=Variant::DICTIONARY || iv.get_type()!=Variant::DICTIONARY || tv.get_type()!=Variant::DICTIONARY || cv.get_type()!=Variant::DICTIONARY || uv.get_type()!=Variant::DICTIONARY || capacityv.get_type()!=Variant::INT) return unsupported;
Dictionary samples=sv, orders=ov, rawbytes=bv, integers=iv, totals=tv, counts=cv, budgets=uv;
if (samples.is_read_only() || orders.is_read_only() || rawbytes.is_read_only() || integers.is_read_only() || totals.is_read_only() || counts.is_read_only()) return unsupported;
const std::array<Dictionary,7> maps{samples,orders,rawbytes,integers,totals,counts,budgets};
for (size_t i=0;i<maps.size();++i) for (size_t j=i+1;j<maps.size();++j)
if (UtilityFunctions::is_same(maps[i],maps[j])) return unsupported;
const bool existing=samples.has(metric);
Variant rawv=samples.get(metric,Array());
if (rawv.get_type()!=Variant::ARRAY) return unsupported;
Array values=rawv;
if (values.is_read_only()) return unsupported;
for (int64_t i=0;i<values.size();++i) if (values[i].get_type()!=Variant::INT) return unsupported;
Variant totalv=totals.get(metric,0), countv=counts.get(metric,0), budgetv=budgets.get(metric,Dictionary());
if (totalv.get_type()!=Variant::INT || countv.get_type()!=Variant::INT || budgetv.get_type()!=Variant::DICTIONARY) return unsupported;
Dictionary budget=budgetv;
for (const Dictionary &map: maps) if (UtilityFunctions::is_same(budget,map)) return unsupported;
const StringName aggregation_key("aggregation",false), limit_key("limit_us",false);
Variant aggregationv=budget.get(aggregation_key,1), limitv=budget.get(limit_key,0);
if (aggregationv.get_type()!=Variant::INT || limitv.get_type()!=Variant::INT) return unsupported;
// One exact byte snapshot serves both builtin validation helpers inside
// this call; there are no external calls between their original checks.
PackedByteArray before=UtilityFunctions::var_to_bytes(values);
TypedArray<int64_t> ordered;
Variant savedbytes=rawbytes.get(metric,PackedByteArray());
bool reuse=existing && orders.has(metric) && savedbytes.get_type()==Variant::PACKED_BYTE_ARRAY && PackedByteArray(savedbytes)==before;
if (reuse) {
Variant orderv=orders[metric];
if (orderv.get_type()!=Variant::ARRAY) return unsupported;
Array prior=orderv;
if (prior.is_read_only() || !prior.is_typed() || prior.get_typed_builtin()!=Variant::INT || prior.size()!=values.size()) return unsupported;
ordered=prior;
} else {
for (int64_t i=0;i<values.size();++i) ordered.append(values[i]);
ordered.sort();
}
// Guards completed: mutations preserve raw and reused ordered aliases.
if (!existing) samples[metric]=values;
integers[metric]=before;
if (!reuse) { orders[metric]=ordered; rawbytes[metric]=before; }
values.append(duration);
ordered.insert(ordered.bsearch(duration),duration);
if (values.size()>int64_t(capacityv)) {
Variant removed=values.pop_front();
ordered.remove_at(ordered.bsearch(removed));
}
PackedByteArray after=UtilityFunctions::var_to_bytes(values);
rawbytes[metric]=after; integers[metric]=after;
const int64_t lifetime_total=the_tree_native::signed_add(int64_t(totalv),duration);
const int64_t lifetime_count=the_tree_native::signed_add(int64_t(countv),1);
totals[metric]=lifetime_total; counts[metric]=lifetime_count;
const int64_t average=lifetime_count>0 ? lifetime_total/lifetime_count : 0;
const int64_t maximum=ordered.is_empty() ? 0 : std::max<int64_t>(0,int64_t(ordered[ordered.size()-1]));
int64_t p95=0;
if (!ordered.is_empty()) {
const int64_t index=std::max<int64_t>(the_tree_native::signed_add(the_tree_native::signed_add(signed_product(95,ordered.size()),99)/100,-1),0);
p95=ordered[std::min<int64_t>(index,ordered.size()-1)];
}
const int64_t aggregation=aggregationv, limit=limitv;
// Original default match is P95, including unknown aggregation values.
const int64_t measured=aggregation==0 ? average : (aggregation==2 ? maximum : p95);
Dictionary report;
report[StringName("metric_id",false)]=metric;
report[StringName("window_sample_count",false)]=values.size();
report[StringName("lifetime_sample_count",false)]=lifetime_count;
report[StringName("average_us",false)]=average;
report[StringName("p95_us",false)]=p95;
report[StringName("maximum_us",false)]=maximum;
report[aggregation_key]=aggregation;
report[StringName("measured_us",false)]=measured;
report[limit_key]=limit;
report[StringName("budget_exceeded",false)]=limit>0 && measured>limit;
Dictionary result; result[supported]=true; result[report_key]=report; return result;
}
#include "guest_candidate_batch.inc"
void clear_edge_cache() { cached_edges.clear(); }
Dictionary search(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider) {
return search_impl(cells, indices, start_index, goals, edge_provider, false);
}
Dictionary search_cached(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider) {
return search_impl(cells, indices, start_index, goals, edge_provider, true);
}
// One ordered projection, with no new persistent ownership/cache. Only
// builtin pure getters and the already guarded sole budget observer qualify.
Dictionary project_guest_candidates(Object *runtime, const StringName &guest_id,
int64_t open_state, int64_t degraded_state, int64_t movement_scale,
int64_t stair_credit, int64_t orthogonal_cost, const Callable &ticks) {
const ProjectionNames n;
Dictionary unsupported;
unsupported[n.k_supported] = false;
if (!builtin(n,runtime, "res://autoload/simulation_runtime.gd") || !ticks.is_valid()) return unsupported;
Object *path = runtime->get(n.k_path_service);
Object *elevators = runtime->get(n.k_elevators);
Object *facilities = runtime->get(n.k_facility_service);
Object *definitions = runtime->get(n.k_definition_registry);
Object *inventory = runtime->get(n.k_inventory_service);
Object *guests = runtime->get(n.k_guest_service);
if (!builtin(n,path,"res://scripts/world/path_service.gd") ||
!builtin(n,elevators,"res://scripts/transport/elevator_service.gd") ||
!builtin(n,facilities,"res://scripts/facility/facility_service.gd") ||
!builtin(n,definitions,"res://scripts/core/definition_registry.gd") ||
!builtin(n,inventory,"res://scripts/inventory/inventory_service.gd") ||
!builtin(n,guests,"res://scripts/guest/guest_service.gd") ||
!static_cast<bool>(runtime->call(n.k__guest_access_batch_can_select))) return unsupported;
Object *guest = guests->call(n.k_get_guest,guest_id);
Array candidates;
if (!guest) {
Dictionary result; result[n.k_supported] = true;
result[n.k_candidates] = candidates; return result;
}
if (!builtin(n,guest,"res://scripts/guest/guest_runtime.gd")) return unsupported;
const Array initial = facilities->call(n.k_get_instances);
// Preflight is read-only: default registry/get_instances have no public
// error/counter effects. Custom resources retain the original whole loop.
for (int64_t i=0;i<initial.size();++i) {
Object *facility = initial[i];
if (!builtin(n,facility,"res://scripts/facility/facility_instance.gd")) return unsupported;
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
if (definition && !builtin(n,definition,"res://scripts/data/facility_definition.gd")) return unsupported;
}
Array goals;
for (int64_t i=0;i<initial.size();++i) goals.append_array(facility_access_cells(n,path,initial[i]));
const Vector3i start = guest->get(n.k_current_cell);
path->call(n.k_begin_guest_path_query_batch,start,goals);
const Array ordered = facilities->call(n.k_get_instances);
TypedArray<int64_t> layers; layers.push_back(0); layers.push_back(1);
TypedArray<StringName> access_ids;
for (int64_t i=0;i<ordered.size();++i) {
Object *facility = ordered[i];
Object *definition = definitions->call(n.k_get_facility,facility->get(n.k_definition_id));
if (!definition) continue;
const Array tags = definition->get(n.k_tags);
if (tags.has(n.k_staff_only)) continue;
if (tags.has(n.k_entrance) && static_cast<bool>(runtime->call(n.k__guest_has_checked_in,guest))) continue;
bool has_inputs = true;
const Dictionary inputs = definition->get(n.k_inventory_inputs);
const Array items = sorted_builtin_input_names(n,runtime,inputs);
for (int64_t j=0;j<items.size();++j) {
const int64_t quantity = inventory->call(n.k_available_quantity,facility->get(n.k_local_inventory_id),items[j]);
if (quantity < static_cast<int64_t>(inputs[items[j]])) {has_inputs=false;break;}
}
if (!has_inputs) {
Dictionary row;row[n.k_facility_id]=facility->get(n.k_instance_id);
row[n.k_inputs_available]=false;candidates.push_back(row);continue;
}
const Array destinations = facility_access_cells(n,path,facility);
Dictionary route = nearest_guest_access_impl(n,path,start,destinations,facility->get(n.k_origin),layers,access_ids,ticks);
if (static_cast<bool>(route.get(n.k_supported,false))) route.erase(n.k_supported);
else route = Dictionary(runtime->call(n.k__find_facility_access_path,start,facility));
const Array walk = route.get(n.k_path,Array());
const bool plain_tag_relief = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
const Dictionary relief = plain_tag_relief ? builtin_tag_relief(n,tags) :
Dictionary(runtime->call(n.k__need_relief_for_facility_tags,tags));
Dictionary row;
row[n.k_facility_id]=facility->get(n.k_instance_id);
row[n.k_facility_tags]=tags.duplicate();
const int64_t state = facility->get(n.k_state);
row[n.k_is_open]=(state==open_state || state==degraded_state);
row[n.k_reachable]=route.get(n.k_reachable,false);
row[n.k_travel_minutes]=guest_path_minutes(n,path,elevators,walk,movement_scale,stair_credit,orthogonal_cost);
const Array queue = facility->get(n.k_queue_entries);
const int64_t capacity = facility->get(n.k_capacity);
row[n.k_expected_wait]=signed_product(queue.size(),facility->get(n.k_base_service_minutes))/std::max<int64_t>(capacity,1);
row[n.k_estimated_total_gold]=runtime->call(n.k_get_facility_business_price,facility);
const int64_t quality = facility->get(n.k_base_quality);
row[n.k_expected_quality]=std::max<int64_t>(0,std::min<int64_t>(quality,100));
row[n.k_need_relief]=relief;
row[n.k_risk_level]=int64_t(0);row[n.k_illegal_level]=int64_t(0);
row[n.k_group_fit]=signed_product(std::min<int64_t>(capacity,4),5);
// Recheck at the original call position: preceding price/observer
// callbacks must retain a replaced/custom runtime's original call.
const bool plain_tag_category = builtin(n,runtime,"res://autoload/simulation_runtime.gd") &&
tags.is_typed() && tags.get_typed_builtin()==Variant::STRING_NAME;
row[n.k_service_category]=plain_tag_category ? Variant(builtin_tag_category(n,tags)) :
runtime->call(n.k__service_category_for_tags,tags);
Dictionary handle;handle[n.k_target_cell]=route.get(n.k_target_cell,guest->get(n.k_current_cell));
handle[n.k_graph_revision]=path->get(n.k_graph_revision);
row[n.k_path_handle]=handle;candidates.push_back(row);
}
path->call(n.k_end_guest_path_query_batch);
Dictionary result;result[n.k_supported]=true;result[n.k_candidates]=candidates;return result;
}
private:
// Direct translation of the two pure builtin tag methods. Fresh result,
// original insertion/branch order, no retained definition/tag memo.
static Dictionary builtin_tag_relief(const ProjectionNames &n,const Array &tags) {
Dictionary relief;
relief[n.k_tagproj_hunger]=int64_t(0);relief[n.k_tagproj_sleep]=int64_t(0);
relief[n.k_tagproj_hygiene]=int64_t(0);relief[n.k_tagproj_medical]=int64_t(0);
relief[n.k_tagproj_leisure]=int64_t(0);relief[n.k_tagproj_intimacy]=int64_t(0);
if(tags.has(n.k_tagproj_dining)) {relief[n.k_tagproj_hunger]=int64_t(80);relief[n.k_tagproj_leisure]=int64_t(10);}
if(tags.has(n.k_tagproj_lodging)) {relief[n.k_tagproj_sleep]=int64_t(90);relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),10);}
if(tags.has(n.k_tagproj_social)||tags.has(n.k_tagproj_leisure)) relief[n.k_tagproj_leisure]=std::max<int64_t>(int64_t(relief[n.k_tagproj_leisure]),40);
if(tags.has(n.k_tagproj_hygiene)||tags.has(n.k_tagproj_bath)) relief[n.k_tagproj_hygiene]=std::max<int64_t>(int64_t(relief[n.k_tagproj_hygiene]),80);
if(tags.has(n.k_tagproj_medical)) relief[n.k_tagproj_medical]=int64_t(90);
else if(tags.has(n.k_tagproj_wellness)) relief[n.k_tagproj_medical]=std::max<int64_t>(int64_t(relief[n.k_tagproj_medical]),20);
if(tags.has(n.k_tagproj_adult_only)||tags.has(n.k_tagproj_restricted_service)) relief[n.k_tagproj_intimacy]=int64_t(80);
return relief;
}
static StringName builtin_tag_category(const ProjectionNames &n,const Array &tags) {
if(tags.has(n.k_tagproj_dining))return n.k_tagproj_food;
if(tags.has(n.k_tagproj_lodging))return n.k_tagproj_lodging;
if(tags.has(n.k_tagproj_social))return n.k_tagproj_leisure;
return n.k_tagproj_service;
}
static bool builtin(const ProjectionNames &n,Object *object,const char *resource) {
if (!object) return false;Object *script=object->get_script();
return script && String(script->get(n.k_resource_path))==resource;
}
// Exact builtin cache-key spelling. No normalized/reordered profile and no
// persistent cache; String lengths count Unicode codepoints as GDScript does.
static String cache_key_suffix(const ProjectionNames &n,Object *path, const TypedArray<int64_t> &layers,
const TypedArray<StringName> &access) {
String layer_text, access_text;
for (int64_t i=0; i<layers.size(); ++i) {
if (i) layer_text += ",";
layer_text += String::num_int64(static_cast<int64_t>(layers[i]));
}
for (int64_t i=0; i<access.size(); ++i) {
if (i) access_text += ",";
const String value = String(static_cast<StringName>(access[i]));
access_text += String::num_int64(value.length()) + ":" + value;
}
return String("|L:") + layer_text + "|A:" + access_text + "|R:" +
String::num_int64(static_cast<int64_t>(path->get(n.k_graph_revision)));
}
static String cache_key_with_suffix(const Vector3i &start, const Vector3i &goal,
const String &suffix) {
return String::num_int64(start.x) + "," + String::num_int64(start.y) + "," +
String::num_int64(start.z) + ">" + String::num_int64(goal.x) + "," +
String::num_int64(goal.y) + "," + String::num_int64(goal.z) + suffix;
}
static int64_t signed_product(int64_t a,int64_t b) {
const uint64_t product=static_cast<uint64_t>(a)*static_cast<uint64_t>(b);
if (product<=static_cast<uint64_t>(std::numeric_limits<int64_t>::max())) return static_cast<int64_t>(product);
return std::numeric_limits<int64_t>::min()+static_cast<int64_t>(product-(uint64_t(1)<<63));
}
static Array facility_access_cells(const ProjectionNames &n,Object *path,Object *facility) {
const Dictionary passable=path->get(n.k__passable_cells);
Array occupied=Array(facility->get(n.k_occupied_cells)).duplicate();
if (occupied.is_empty()) occupied.push_back(facility->get(n.k_origin));
Dictionary unique;
for (int64_t i=0;i<occupied.size();++i) {
const Vector3i cell=occupied[i];
for (int32_t dx : {-1,1}) {
// Match GDScript's Vector3i conversion after int64 addition.
const Vector3i candidate(int64_t(cell.x)+dx,cell.y,cell.z);
if (passable.has(candidate)) unique[candidate]=true;
}
}
const Vector3i origin=facility->get(n.k_origin);if(passable.has(origin)) unique[origin]=true;
const Array keys=unique.keys();std::vector<Vector3i> sorted;sorted.reserve(keys.size());
for (int64_t i=0;i<keys.size();++i) sorted.push_back(keys[i]);
std::sort(sorted.begin(),sorted.end(),[](const Vector3i &a,const Vector3i &b){
if(a.z!=b.z)return a.z<b.z;if(a.y!=b.y)return a.y<b.y;return a.x<b.x;
});
Array result;for(const Vector3i &cell:sorted)result.push_back(cell);return result;
}
static int64_t guest_path_minutes(const ProjectionNames &n,Object *path,Object *elevators,const Array &route,
int64_t movement_scale,int64_t stair_credit,int64_t orthogonal_cost) {
Dictionary memo=path->get(n.k__guest_step_connector_memo);
// Route-local only. Reuse an ownership result only after an actual
// BOOL return and a typed cached step; no script callback occurs on a
// repeated typed memo hit. A miss/conversion/custom script keeps calls.
const bool builtin_pair = builtin(n,path,"res://scripts/world/path_service.gd") &&
builtin(n,elevators,"res://scripts/transport/elevator_service.gd");
bool ownership_valid = false;
bool ownership_value = false;
StringName ownership_connector;
for(int64_t i=1;i<route.size();++i) {
const Vector3i from=route[i-1],to=route[i];
const Dictionary destinations=memo.get(from,Dictionary());
StringName connector;
const bool memo_hit = destinations.has(to);
const bool typed_memo_hit = memo_hit && destinations[to].get_type() == Variant::STRING_NAME;
if(memo_hit)connector=destinations[to];
else {TypedArray<StringName> access;connector=path->call(n.k_get_step_connector,from,to,access);}
bool special;
if (builtin_pair && typed_memo_hit && ownership_valid && connector == ownership_connector) {
special = ownership_value;
} else {
const Variant owned = elevators->call(n.k_owns_connector,connector);
special = static_cast<bool>(owned);
ownership_valid = builtin_pair && typed_memo_hit && owned.get_type() == Variant::BOOL;
ownership_value = special;
ownership_connector = connector;
}
if(!special && String(connector).begins_with("infra.connector:") && from.x==to.x && from.z==to.z &&
std::abs(int64_t(from.y)-int64_t(to.y))==1) {
const Dictionary detail=path->call(n.k_get_connector,connector);
special=detail.get(n.k_movement_type,StringName())==Variant(n.k_CONNECTOR) &&
static_cast<int64_t>(detail.get(n.k_cost,int64_t(0)))==150 && stair_credit>movement_scale;
}
if(special) {
const int64_t cost=path->call(n.k_calculate_guest_batch_path_cost,route[0],route[route.size()-1],route);
return static_cast<int64_t>(std::ceil(static_cast<double>(cost)/static_cast<double>(orthogonal_cost)));
}
}
return std::max<int64_t>(route.size()-1,0);
}
public:
// Stateless translation of the builtin nearest access query. The caller
// supplies the existing typed default profile and the real Time callable.
// Public cache publication, failure diagnostics and fallback stay ordered.
Dictionary nearest_guest_access(Object *path, const Vector3i &start,
const Array &goals, const Vector3i &fallback_target,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
const Callable &ticks) {
const ProjectionNames n;
return nearest_guest_access_impl(n,path,start,goals,fallback_target,layers,access,ticks);
}
private:
Dictionary nearest_guest_access_impl(const ProjectionNames &n,Object *path, const Vector3i &start,
const Array &goals, const Vector3i &fallback_target,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access,
const Callable &ticks) {
Dictionary unsupported;
unsupported[n.k_supported] = false;
if (!path || !ticks.is_valid() || goals.is_empty()) return unsupported;
Object *script = path->get_script();
if (!script || String(script->get(n.k_resource_path)) != "res://scripts/world/path_service.gd") return unsupported;
Dictionary batch = path->get(n.k__query_batch);
if (batch.is_empty() || start != static_cast<Vector3i>(batch[n.k_start])) return unsupported;
const Dictionary passable = path->get(n.k__passable_cells);
if (!passable.has(start) || blocked(n,path, start) || !layers.has(start.z)) return unsupported;
const Dictionary targets = batch[n.k_targets];
Dictionary cache = path->get(n.k__path_cache);
// Exact builtin validation loop has no callback before ticks.call().
// Build the unchanged profile/revision suffix lazily at the first key.
String key_suffix;
bool key_suffix_ready = false;
for (int64_t j = 0; j < goals.size(); ++j) {
if (goals[j].get_type() != Variant::VECTOR3I) return unsupported;
const Vector3i cell = goals[j];
if (!targets.has(cell)) {
const bool searchable = passable.has(cell) && layers.has(cell.z) && !blocked(n,path, cell);
if (searchable && (start.z == cell.z || static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, cell, layers, access)))) return unsupported;
}
if (!key_suffix_ready) {
key_suffix = cache_key_suffix(n,path, layers, access);
key_suffix_ready = true;
}
const String key = cache_key_with_suffix(start, cell, key_suffix);
if (cache.has(key)) return unsupported;
}
const int64_t started = ticks.call();
if (!static_cast<bool>(batch[n.k_ready])) {
batch[n.k_tree] = path->call(n.k__build_guest_query_tree_compact, start, targets, layers, access);
batch[n.k_arithmetic_wrapped] = path->get(n.k__guest_tree_arithmetic_wrapped);
batch[n.k_ready] = true;
}
const Dictionary tree = batch[n.k_tree];
if (!static_cast<bool>(tree.get(n.k_usable, false)) || static_cast<bool>(batch.get(n.k_arithmetic_wrapped, false))) return unsupported;
Vector3i best_cell = fallback_target;
bool found = false;
int64_t best_cost = 0;
const Dictionary settled = tree[n.k_settled];
bool cost_view_ready=false,compact_cost_view=false;
Dictionary cost_indices,cost_dictionary;
PackedInt64Array cost_values;
for (int64_t j = 0; j < goals.size(); ++j) {
const Vector3i cell = goals[j];
if (!targets.has(cell) || !settled.has(cell)) continue;
// No callback occurs between these original numeric cost reads.
// Initialize lazily at the first eligible goal, and retain nothing
// past this call or reuse after the subsequent route callbacks.
if (!cost_view_ready) {
compact_cost_view=tree.get(n.k_compact,false);
if(compact_cost_view) {cost_indices=tree[n.k_indices];cost_values=tree[n.k_cost_values];}
else cost_dictionary=tree[n.k_costs];
cost_view_ready=true;
}
int64_t cost=0;
if(compact_cost_view) {
if(!cost_indices.has(cell)) return unsupported;
const int64_t index=cost_indices[cell];
if(index<0 || index>=cost_values.size()) return unsupported;
cost=cost_values[index];
} else {
if(!cost_dictionary.has(cell)) return unsupported;
cost=cost_dictionary[cell];
}
if (!found || cost < best_cost) {
found = true;
best_cost = cost;
best_cell = cell;
}
}
TypedArray<Vector3i> best_path;
if (found) {
best_path = resolve_ready_guest_point(n,path, start, best_cell, tree, layers, access);
if (best_path.is_empty()) return unsupported;
}
if (!goals.is_empty() && (!found || goals[goals.size() - 1] != Variant(best_cell))) {
resolve_ready_guest_point(n,path, start, goals[goals.size() - 1], tree, layers, access);
}
const int64_t elapsed = the_tree_native::signed_add(static_cast<int64_t>(ticks.call()), the_tree_native::signed_add(~started, 1));
path->emit_signal(n.k_path_query_measured, std::max<int64_t>(elapsed, 0));
Dictionary result;
result[n.k_supported] = true;
result[n.k_reachable] = found;
result[n.k_path] = best_path;
result[n.k_target_cell] = best_cell;
return result;
}
private:
// Only StringName keys qualify. Conversion-sensitive and custom runtime
// cases retain the original script sorter. No owner values are retained.
static Array sorted_builtin_input_names(const ProjectionNames &n,Object *runtime,const Dictionary &inputs) {
auto original=[&]() -> Array {return runtime->call(n.k__sorted_name_keys,inputs);};
if(!builtin(n,runtime,"res://autoload/simulation_runtime.gd")) return original();
const Array keys=inputs.keys();
std::vector<std::pair<String,StringName>> rows;
rows.reserve(keys.size());
for(int64_t i=0;i<keys.size();++i) {
if(keys[i].get_type()!=Variant::STRING_NAME) return original();
const StringName name=keys[i];rows.emplace_back(String(name),name);
}
// String ordering is the same engine operator used by the script.
std::sort(rows.begin(),rows.end(),[](const auto &a,const auto &b){return a.first<b.first;});
TypedArray<StringName> result;
for(const auto &row:rows) result.push_back(row.second);
return result;
}
// Fresh writable typed output, matching the builtin append loop. Check
// the script at this original call position, after any route callbacks.
static Variant copy_builtin_guest_route(const ProjectionNames &n,Object *path,const TypedArray<Vector3i> &route) {
if(!builtin(n,path,"res://scripts/world/path_service.gd")) return path->call(n.k__copy_path,route);
TypedArray<Vector3i> copied;
for(int64_t i=0;i<route.size();++i) copied.push_back(route[i]);
return copied;
}
static bool blocked(const ProjectionNames &n,Object *path, const Vector3i &cell) {
const Dictionary traffic_map = path->get(n.k__cell_traffic);
const Dictionary traffic = traffic_map.get(cell, Dictionary());
return !traffic.is_empty() && static_cast<bool>(traffic[n.k_temporary_block]);
}
static bool tree_has_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
const Dictionary values = tree[n.k_costs];
return values.has(cell);
}
const Dictionary indices = tree[n.k_indices];
if (!indices.has(cell)) return false;
const int64_t index = indices[cell];
const PackedInt64Array values = tree[n.k_cost_values];
return index >= 0 && index < values.size();
}
static int64_t tree_cost(const ProjectionNames &n,const Dictionary &tree, const Vector3i &cell) {
if (!static_cast<bool>(tree.get(n.k_compact, false))) {
const Dictionary values = tree[n.k_costs];
return static_cast<int64_t>(values[cell]);
}
const Dictionary indices = tree[n.k_indices];
const PackedInt64Array values = tree[n.k_cost_values];
return values[static_cast<int64_t>(indices[cell])];
}
static TypedArray<Vector3i> resolve_ready_guest_point(const ProjectionNames &n,Object *path,
const Vector3i &start, const Vector3i &goal, const Dictionary &tree,
const TypedArray<int64_t> &layers, const TypedArray<StringName> &access) {
const Dictionary passable = path->get(n.k__passable_cells);
if (!passable.has(start)) return path->call(n.k__route_failure, n.k_START_NOT_PASSABLE);
if (!passable.has(goal)) return path->call(n.k__route_failure, n.k_GOAL_NOT_PASSABLE);
if (!layers.has(start.z) || !layers.has(goal.z)) return path->call(n.k__route_failure, n.k_ACCESS_LAYER_DENIED);
if (blocked(n,path, start)) return path->call(n.k__route_failure, n.k_START_TEMPORARILY_BLOCKED);
if (blocked(n,path, goal)) return path->call(n.k__route_failure, n.k_GOAL_TEMPORARILY_BLOCKED);
// ticks/tree callbacks may have changed the script or revision. Recheck
// at this original call position and never reuse the pre-tick suffix.
const String key = builtin(n,path,"res://scripts/world/path_service.gd") ?
cache_key_with_suffix(start, goal, cache_key_suffix(n,path, layers, access)) :
String(path->call(n.k__cache_key, start, goal, layers, access));
Dictionary cache = path->get(n.k__path_cache);
const Dictionary batch = path->get(n.k__query_batch);
const Dictionary targets = batch[n.k_targets];
if (cache.has(key) || !targets.has(goal)) return path->call(n.k__find_path_internal, start, goal);
path->set(n.k_cache_misses, the_tree_native::signed_add(static_cast<int64_t>(path->get(n.k_cache_misses)), 1));
if (start.z != goal.z && !static_cast<bool>(path->call(n.k__guest_batch_has_permitted_layer_crossing, start, goal, layers, access))) return path->call(n.k__route_failure, n.k_GOAL_UNREACHABLE);
TypedArray<Vector3i> route;
const Dictionary settled = tree[n.k_settled];
if (start == goal) route.push_back(start);
else if (settled.has(goal)) route = Array(path->call(n.k__guest_tree_reconstruct_path, tree, goal));
if (route.is_empty()) return path->call(n.k__route_failure, path->call(n.k__diagnose_no_route_reason, start, goal, layers, access));
cache[key] = copy_builtin_guest_route(n,path,route);
path->set(n.k_last_no_route_reason, n.k_OK);
path->set(n.k_last_path_cost, tree_cost(n,tree, goal));
path->set(n.k_last_error, String(""));
return route;
}
public:
private:
// One existing builtin provider operation, with no new value cache. Only
// connector-free WALK rows qualify; unsupported cases call the old provider.
// All work stays private until the original final shared[current] assignment.
struct WalkEdgeNames {
const StringName resource_path{"resource_path",false}, constants_method{"get_script_constant_map",false};
const StringName front{"FRONT",false}, back{"BACK",false}, walk{"MOVEMENT_WALK",false};
const StringName base{"ORTHOGONAL_MOVE_COST",false}, congestion{"CONGESTION_COST_PER_EXCESS",false};
const StringName workspace{"_guest_tree_workspace",false}, edges{"edges",false}, indices{"indices",false};
const StringName adjacency{"_adjacency",false}, traffic{"_cell_traffic",false}, vertical{"_vertical_walk_requires_connector",false};
const StringName to{"to",false}, connector{"connector_id",false}, access{"access_id",false}, movement{"movement_type",false};
const StringName base_cost{"base_cost",false}, cost{"cost",false}, temporary{"temporary_block",false};
const StringName dynamic{"dynamic_cost",false}, density{"current_density",false}, capacity{"base_capacity",false};
const StringName provider{"_guest_tree_shared_edges",false};
};
struct WalkEdgeContext {
Object *path=nullptr;
int64_t front=0, back=0, base=0, congestion=0;
StringName walk;
};
static bool walk_edge_context(const WalkEdgeNames &n,Object *path,const Array &layers,
const Array &access,WalkEdgeContext &context) {
if (!path || layers.size()!=2 || !access.is_empty() ||
layers[0].get_type()!=Variant::INT || layers[1].get_type()!=Variant::INT) return false;
Object *script=path->get_script();
if (!script || String(script->get(n.resource_path))!="res://scripts/world/path_service.gd" ||
!script->has_method(n.constants_method)) return false;
const Variant value=script->call(n.constants_method);
if (value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary constants=value;
for (const StringName &key : {n.front,n.back,n.base,n.congestion})
if (constants.get(key,Variant()).get_type()!=Variant::INT) return false;
if (constants.get(n.walk,Variant()).get_type()!=Variant::STRING_NAME ||
int64_t(layers[0])!=int64_t(constants[n.front]) ||
int64_t(layers[1])!=int64_t(constants[n.back])) return false;
context.path=path;context.front=constants[n.front];context.back=constants[n.back];
context.base=constants[n.base];context.congestion=constants[n.congestion];context.walk=constants[n.walk];
return true;
}
static bool builtin_walk_edge_rows(const WalkEdgeNames &n,const WalkEdgeContext &context,
const Vector3i &current,Array &rows) {
if (!context.path) return false;
const Variant workspace_value=context.path->get(n.workspace);
if (workspace_value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary workspace=workspace_value;
const Variant shared_value=workspace.get(n.edges,Variant());
if (shared_value.get_type()!=Variant::DICTIONARY) return false;
Dictionary shared=shared_value;
// Original cached-row branch precedes readonly and all other state reads.
if (shared.has(current)) {
const Variant cached=shared[current];
if (cached.get_type()!=Variant::ARRAY) return false;
rows=cached;return true;
}
if (shared.is_read_only()) return false;
const Variant indices_value=workspace.get(n.indices,Variant()), adjacency_value=context.path->get(n.adjacency);
const Variant traffic_value=context.path->get(n.traffic), vertical_value=context.path->get(n.vertical);
if (indices_value.get_type()!=Variant::DICTIONARY || adjacency_value.get_type()!=Variant::DICTIONARY ||
traffic_value.get_type()!=Variant::DICTIONARY || vertical_value.get_type()!=Variant::BOOL) return false;
const Dictionary indices=indices_value, adjacency=adjacency_value, traffic=traffic_value;
const Variant raw_value=adjacency.get(current,Array());
if (raw_value.get_type()!=Variant::ARRAY) return false;
const Array raw=raw_value;Array result;
for (int64_t i=0;i<raw.size();++i) {
if (raw[i].get_type()!=Variant::DICTIONARY) return false;
const Dictionary edge=raw[i];
if (edge.get(n.to,Variant()).get_type()!=Variant::VECTOR3I) return false;
const Vector3i neighbor=edge[n.to];
if (neighbor.z!=context.front && neighbor.z!=context.back) continue;
const Variant row_value=traffic.get(neighbor,Dictionary());
if (row_value.get_type()!=Variant::DICTIONARY) return false;
const Dictionary row=row_value;
if (!row.is_empty()) {
if (row.get(n.temporary,Variant()).get_type()!=Variant::BOOL) return false;
if (bool(row[n.temporary])) continue;
}
// Preserve old method for every connector/access/other movement row.
if (edge.get(n.connector,Variant()).get_type()!=Variant::STRING_NAME ||
edge.get(n.access,Variant()).get_type()!=Variant::STRING_NAME ||
edge.get(n.movement,Variant()).get_type()!=Variant::STRING_NAME) return false;
const StringName connector=edge[n.connector], access=edge[n.access], movement=edge[n.movement];
if (!connector.is_empty() || !access.is_empty() || movement!=context.walk) return false;
if (bool(vertical_value) && current.y!=neighbor.y) continue;
const Variant base=edge.get(n.base_cost,edge.get(n.cost,context.base));
if (base.get_type()!=Variant::INT) return false;
int64_t dynamic=0;
if (!row.is_empty()) {
for (const StringName &key : {n.dynamic,n.density,n.capacity})
if (row.get(key,Variant()).get_type()!=Variant::INT) return false;
const int64_t excess=the_tree_native::signed_add(int64_t(row[n.density]),
the_tree_native::signed_add(~int64_t(row[n.capacity]),1));
dynamic=the_tree_native::signed_add(int64_t(row[n.dynamic]),
signed_product(excess>0?excess:0,context.congestion));
}
const int64_t cost=the_tree_native::signed_add(int64_t(base),dynamic);
Array pair;pair.push_back(neighbor);pair.push_back(cost);result.push_back(pair);
// Same short circuit and first invalid prefix as the original method.
if (cost<=0 || !indices.has(neighbor)) break;
}
shared[current]=result;rows=result;return true;
}
public:
Dictionary guest_tree_edge_rows(Object *path,const Vector3i &current,const Array &layers,const Array &access) {
const WalkEdgeNames names;WalkEdgeContext context;Array rows;
Dictionary result;const StringName supported{"supported",false}, row_key{"rows",false};
result[supported]=false;
if (!walk_edge_context(names,path,layers,access,context) ||
!builtin_walk_edge_rows(names,context,current,rows)) return result;
result[supported]=true;result[row_key]=rows;return result;
}
private:
Dictionary search_impl(const Array &cells, const Dictionary &indices, I start_index,
const Dictionary &goals, const Callable &edge_provider, bool use_edge_cache) {
Dictionary output;
output[StringName("status")] = String("unusable");
if (start_index < 0 || start_index >= cells.size() || !edge_provider.is_valid()) return output;
try {
std::vector<I> goal_indices;
const Array goal_keys = goals.keys();
for (I j = 0; j < goal_keys.size(); ++j)
goal_indices.push_back(static_cast<I>(indices.get(goal_keys[j], I(-1))));
Array arguments;
arguments.resize(1);
const WalkEdgeNames walk_names;WalkEdgeContext walk_context;
if (edge_provider.get_method()==walk_names.provider && edge_provider.get_argument_count()==1 &&
edge_provider.get_bound_arguments_count()==2 && edge_provider.get_unbound_arguments_count()==0) {
const Array bound=edge_provider.get_bound_arguments();
if (bound.size()==2 && bound[0].get_type()==Variant::ARRAY && bound[1].get_type()==Variant::ARRAY)
walk_edge_context(walk_names,edge_provider.get_object(),bound[0],bound[1],walk_context);
}
// Call the original bound Godot edge method only when the search expands a node.
// Preserve its lazy cache population, filter ordering and first invalid row.
auto original_edges = [&](I current) {
arguments[0] = cells[current];
Array fused;bool fused_supported=false;
if (cells[current].get_type()==Variant::VECTOR3I) {
const Vector3i cell=cells[current];
fused_supported=builtin_walk_edge_rows(walk_names,walk_context,cell,fused);
}
const Variant value = fused_supported ? Variant(fused) : edge_provider.callv(arguments);
if (value.get_type() != Variant::ARRAY) return std::vector<Edge>{{-1, 0}};
const Array rows = value;
std::vector<Edge> result;
result.reserve(rows.size());
for (I j = 0; j < rows.size(); ++j) {
if (rows[j].get_type() != Variant::ARRAY) { result.push_back({-1, 0}); break; }
const Array row = rows[j];
if (row.size() != 2 || row[1].get_type() != Variant::INT) {
result.push_back({-1, 0}); break;
}
const I cost = static_cast<I>(row[1]);
// Nonpositive cost is rejected before requesting the neighbor index.
if (cost <= 0) { result.push_back({-1, cost}); break; }
const I neighbor = static_cast<I>(indices.get(row[0], I(-1)));
result.push_back({neighbor, cost});
if (neighbor < 0) break;
}
return result;
};
// Borrow cached rows only during the pure numeric edge loop.
// No engine callback runs while that borrowed vector is traversed.
std::vector<Edge> converted;
auto edges = [&](I current) -> const std::vector<Edge>& {
if (use_edge_cache) {
const auto found = cached_edges.find(current);
if (found != cached_edges.end()) return found->second;
}
converted = original_edges(current);
// Preserve the returned conversion even if a reentrant provider
// populated this cache key first. Never substitute its row here.
if (use_edge_cache) cached_edges.emplace(current, converted);
return converted;
};
const auto result = the_tree_native::search(cells.size(), start_index, goal_indices, edges);
output[StringName("status")] = String(result.status.c_str());
if (result.status != "usable") return output;
PackedInt64Array costs, parents;
if (costs.resize(result.costs.size()) != OK || parents.resize(result.parents.size()) != OK) {
output[StringName("status")] = String("unusable");
return output;
}
// Newly resized, private packed arrays own their writable storage.
// A provider may shrink caller cells. Preserve the old written
// prefix and resize-created zero tail, not the whole native vector.
const I written_count=cells.size();
if(written_count<=static_cast<I>(result.costs.size())) {
std::copy_n(result.costs.begin(),written_count,costs.ptrw());
std::copy_n(result.parents.begin(),written_count,parents.ptrw());
} else {
// Keep the original unsupported-growth path unchanged.
for (I j=0;j<cells.size();++j) {costs.set(j,result.costs[j]);parents.set(j,result.parents[j]);}
}
TypedArray<int64_t> discovered, parent_discovered;
for (I j : result.discovered) discovered.push_back(j);
for (I j : result.parent_discovered) parent_discovered.push_back(j);
Dictionary settled;
for (I j : result.settled) settled[cells[j]] = true;
output[StringName("cost_values")] = costs;
output[StringName("parent_indices")] = parents;
output[StringName("discovered")] = discovered;
output[StringName("parent_discovered")] = parent_discovered;
output[StringName("settled")] = settled;
return output;
} catch (const std::exception &) {
output = Dictionary();
output[StringName("status")] = String("unusable");
return output;
}
}
};
void initialize_tree_numeric_core(ModuleInitializationLevel level) {
if (level == MODULE_INITIALIZATION_LEVEL_SCENE) GDREGISTER_CLASS(TheTreeNumericCore);
}
void uninitialize_tree_numeric_core(ModuleInitializationLevel) {}
extern "C" {
GDExtensionBool GDE_EXPORT tree_numeric_core_init(GDExtensionInterfaceGetProcAddress get_proc,
GDExtensionClassLibraryPtr library, GDExtensionInitialization *initialization) {
GDExtensionBinding::InitObject init(get_proc, library, initialization);
init.register_initializer(initialize_tree_numeric_core);
init.register_terminator(uninitialize_tree_numeric_core);
init.set_minimum_library_initialization_level(MODULE_INITIALIZATION_LEVEL_SCENE);
return init.init();
}
}
@@ -0,0 +1,7 @@
[configuration]
entry_symbol="tree_numeric_core_init"
compatibility_minimum="4.7.2"
reloadable=false
[libraries]
macos.arm64="/private/tmp/TheTree-input-copy-r335-3afabc8ef9ee42d0be34994471a451b5/candidate.dylib"
@@ -0,0 +1,7 @@
[configuration]
entry_symbol = "the_tree_numeric_library_init"
compatibility_minimum = "4.7.2"
reloadable = false
[libraries]
macos.debug.arm64 = "/private/tmp/TheTree-input-copy-r335-3afabc8ef9ee42d0be34994471a451b5/candidate.dylib"
@@ -0,0 +1,18 @@
{
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
}
@@ -0,0 +1,38 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 13711028791,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,39 @@
{
"actual_captured_pids": [
48850
],
"cleanup": [
{
"pid": 48850,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true
}
@@ -0,0 +1,140 @@
{
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"pid": 48850,
"started_utc": "2026-10-12T04:31:38.713646+00:00",
"ended_utc": "2026-10-12T04:31:44.010083+00:00",
"wall_seconds": 5.29639375,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "501ad12badba237cbff60cf8d3b93d3efe9392872c76064644592b4473d1ef21",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 8420696875,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"started_utc": "2026-10-12T04:31:38.713646+00:00",
"current_process_identity": {
"pid": 48850,
"ppid": 48787,
"pgid": 48850,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 13711028791,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
}
@@ -0,0 +1,40 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 8420696875,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"started_utc": "2026-10-12T04:31:38.713646+00:00",
"current_process_identity": {
"pid": 48850,
"ppid": 48787,
"pgid": 48850,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,15 @@
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys.gd"
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
func _initialize() -> void:
if not Guard.activate(): quit(97); return
super._initialize()
func run() -> void:
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
available = available and probe != null and probe.has_method(&"project_guest_candidates")
probe = null
check(available, "exact native guest projection extension registered before diagnostic")
if not available: quit(96); return
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
super.run()
@@ -0,0 +1,21 @@
{
"Windows_accepted": false,
"case_count": 4,
"checks": 31,
"failures": [],
"fixtures": {
"bytes": 435,
"codec": "zstd",
"field_deletions": 0,
"file_envelope": false,
"full_bytes_roundtrip": true,
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-measurement/fixtures.varbytes.zst",
"sha256": "1ac9e053951ac0aee35ec6d9662c21ea3738077b5460612ae72973d67e095ee3",
"uncompressed_bytes": 3256,
"uncompressed_sha256": "7047978727b451ac7deef043d6126bf732530aca9f8f86377d92cb8ccf28b582"
},
"passed": true,
"performance_accepted": false,
"pid": 48850,
"unit_accepted": false
}
@@ -0,0 +1,185 @@
{
"name": "keys",
"result": {
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"pid": 48850,
"started_utc": "2026-10-12T04:31:38.713646+00:00",
"ended_utc": "2026-10-12T04:31:44.010083+00:00",
"wall_seconds": 5.29639375,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "501ad12badba237cbff60cf8d3b93d3efe9392872c76064644592b4473d1ef21",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 8420696875,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"started_utc": "2026-10-12T04:31:38.713646+00:00",
"current_process_identity": {
"pid": 48850,
"ppid": 48787,
"pgid": 48850,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48850,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"monotonic_ns": 13711028791,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48850,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/keys/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:44.008426+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
},
"capture": {
"actual_captured_pids": [
48850
],
"cleanup": [
{
"pid": 48850,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true,
"outer_receipt_written": true,
"outer_receipt_error": null,
"passed": true
}
}
@@ -0,0 +1,20 @@
{
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-startup",
"conditions": [
true,
true,
true,
true,
true
],
"conditions_checked": 5,
"custom_user_dir_name": "TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime",
"fresh_before_parent_initialize": true,
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-a0e2bb56fdb441558fbd14d619c89c95-impact-runtime/guard-probe",
"profile_writes_before_guard": 0,
"project_settings_persisted": false,
"runtime_settings_only": true,
"verified": true
}
@@ -0,0 +1,51 @@
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-pipeline-boundaries-r195.gd"
const NEW_CASES := ["name_unicode","name_reverse","string_keys","mixed_keys"]
func setup(label: String) -> void:
super.setup("ordinary")
var d = runtime.definition_registry.get_facility(&"finite.definition")
if label == "name_unicode": d.inventory_inputs = {&"猫":0,&"A":0,&"é":0,&"あ":0,&"😀":0}
elif label == "name_reverse": d.inventory_inputs = {&"z":0,&"m":0,&"a":0}
elif label == "string_keys": d.inventory_inputs = {"z":0,"a":0}
else: d.inventory_inputs = {&"z":0,"a":0,&"猫":0}
func run() -> void:
output=OS.get_environment("THE_TREE_RUNTIME_MONITOR_OUTPUT")
runtime=root.get_node("SimulationRuntime");clock=root.get_node("GameClock")
var raw := FileAccess.get_file_as_bytes(OS.get_environment("THE_TREE_REPLAY_SNAPSHOT")).decompress(11411840,FileAccess.COMPRESSION_ZSTD)
var initial: Dictionary=bytes_to_var(raw)
runtime.initialize(clock,root.get_node("GameState"),int(initial[&"systems"][&"runtime"][&"world_seed"]))
check(runtime.restore_snapshot(initial),"fixed646 original seed/context restore")
core=ClassDB.instantiate(&"TheTreeNumericCore")
for label: String in NEW_CASES:
setup(label)
var before := var_to_bytes(state())
var selected := project()
var fallback := label.begins_with("custom_") or label=="path_observer"
check(bool(selected.get(&"supported",false))==not fallback,label+" actual native domain")
if fallback:check(var_to_bytes(state())==before,label+" rejection has no public effects")
var got: Array=runtime._project_guest_candidates(&"finite.guest") if fallback else selected[&"candidates"]
var after := var_to_bytes(state())
var got_bytes := var_to_bytes(got)
check(runtime.path_service._query_batch.is_empty(),label+" derived batch released")
setup(label)
check(var_to_bytes(state())==before,label+" same complete starting state")
var expected: Array=runtime._project_guest_candidates_without_native(&"finite.guest")
check(var_to_bytes(expected)==got_bytes,label+" complete ordered typed candidates")
check(var_to_bytes(state())==after,label+" complete Runtime Path cache errors counters callback count")
if label=="stairs150":check(int(got[0][&"travel_minutes"])==2,label+" stairs ceil150/100")
elif label=="elevator151":check(int(got[0][&"travel_minutes"])==12,label+" elevator ceil((151+1floor*10minutes*100)/100)")
elif label in ["stairs149","foreign150"]:check(int(got[0][&"travel_minutes"])==1,label+" ordinary movement retained")
if label=="integer_wrap":check(int(got[0][&"expected_wait"])==9223372036854775805 and int(got[0][&"group_fit"])==-9223372036854775808,label+" signed multiplication wrap")
if label=="clamp_low":check(got[0][&"expected_quality"]==0 and got[0][&"group_fit"]==0,label+" zero divisor guard and quality lower clamp")
if label=="ordinary":
check(got[0][&"expected_quality"]==100,label+" quality upper clamp")
var protected_bytes := var_to_bytes(expected)
got[0][&"facility_tags"].append(&"mutated");got[0][&"need_relief"].clear();got[0][&"path_handle"].clear()
check(var_to_bytes(expected)==protected_bytes and runtime.definition_registry.get_facility(&"finite.definition").tags==[&"rest"],label+" owned returned tags relief and handle")
records.append({"case":label,"native_supported":not fallback,"candidates":expected,"observer_calls":calls})
core=null
var report := {"passed":failures.is_empty(),"checks":checks,"failures":failures,"pid":OS.get_process_id(),"case_count":NEW_CASES.size(),"fixtures":typed("fixtures",records),"unit_accepted":false,"performance_accepted":false,"Windows_accepted":false}
report["passed"]=failures.is_empty();report["checks"]=checks;report["failures"]=failures
var file := FileAccess.open(output.path_join("report.json"),FileAccess.WRITE)
if file==null:quit(98);return
file.store_string(JSON.stringify(report,"\t"));file.close()
print("Guest pipeline boundaries: %d checks, %d failures"%[checks,failures.size()]);quit(0 if failures.is_empty() else 1)
@@ -0,0 +1,18 @@
{
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
}
@@ -0,0 +1,38 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 6979193458,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,70 @@
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
SDL: Init OK!
Using "default" pen tablet driver...
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
CORE API HASH: 2004498165
EDITOR API HASH: 1696660745
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' at thread -1
SceneTreeFTI: traversal method DEFAULT
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
Loaded system CA certificates
PACK_PROFILE_GUARD verified=true
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
NATIVE_ADAPTER_LIBRARY_REGISTERED
Guest batch point fixtures: 257 checks, 0 failures
@@ -0,0 +1,39 @@
{
"actual_captured_pids": [
48835
],
"cleanup": [
{
"pid": 48835,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true
}
@@ -0,0 +1,140 @@
{
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"pid": 48835,
"started_utc": "2026-10-12T04:31:36.026040+00:00",
"ended_utc": "2026-10-12T04:31:37.279118+00:00",
"wall_seconds": 1.253067208,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "0421417c77aa8e3e402c09222a177085caafc77a8abbd3fc63f34a980e97f925",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 5733207583,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"started_utc": "2026-10-12T04:31:36.026040+00:00",
"current_process_identity": {
"pid": 48835,
"ppid": 48787,
"pgid": 48835,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 6979193458,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
}
@@ -0,0 +1,40 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 5733207583,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"started_utc": "2026-10-12T04:31:36.026040+00:00",
"current_process_identity": {
"pid": 48835,
"ppid": 48787,
"pgid": 48835,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,74 @@
WorkerThreadPool: 10 threads, 3 max low-priority.
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
SDL: Init OK!
Using "default" pen tablet driver...
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
CORE API HASH: 2004498165
EDITOR API HASH: 1696660745
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd' at thread -1
SceneTreeFTI: traversal method DEFAULT
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
Loaded system CA certificates
PACK_PROFILE_GUARD verified=true
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
NATIVE_ADAPTER_LIBRARY_REGISTERED
Guest batch point fixtures: 257 checks, 0 failures
XR: Clearing primary interface
XR: Removed interface "Native mobile"
XR: Removed interface "OpenXR"
@@ -0,0 +1,15 @@
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-access-prewarmed-fixtures-r182.gd"
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
func _initialize() -> void:
if not Guard.activate(): quit(97); return
super._initialize()
func run() -> void:
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
available = available and probe != null and probe.has_method(&"project_guest_candidates")
probe = null
check(available, "exact native guest projection extension registered before diagnostic")
if not available: quit(96); return
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
super.run()
@@ -0,0 +1,25 @@
{
"candidate": "r121 unadopted",
"candidate_adopted": false,
"case_count": 19,
"checks": 257,
"failures": [],
"fixtures": {
"bytes": 1478,
"codec": "zstd",
"field_deletions": 0,
"file_envelope": false,
"full_bytes_roundtrip": true,
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-measurement/point-resolution-fixtures.varbytes.zst",
"sha256": "9023bf17cee888109eb0b12660a7e527369618abcfab12b71962f8b2495c78de",
"uncompressed_bytes": 47820,
"uncompressed_sha256": "f769984e106db6834e147c4495b1cbb3f089a2ec19da404f7585303e7ebde077"
},
"limits": [
"Finite differential ready-batch point resolution against original r79 nearest pipeline; no whole647, arbitrary mutation, general callback, wrapping, native lifetime, normal OS or Windows acceptance."
],
"passed": true,
"performance_budget_accepted": false,
"pid": 48835,
"unit_accepted": false
}
@@ -0,0 +1,185 @@
{
"name": "local",
"result": {
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"pid": 48835,
"started_utc": "2026-10-12T04:31:36.026040+00:00",
"ended_utc": "2026-10-12T04:31:37.279118+00:00",
"wall_seconds": 1.253067208,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "0421417c77aa8e3e402c09222a177085caafc77a8abbd3fc63f34a980e97f925",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 5733207583,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"started_utc": "2026-10-12T04:31:36.026040+00:00",
"current_process_identity": {
"pid": 48835,
"ppid": 48787,
"pgid": 48835,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48835,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"monotonic_ns": 6979193458,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48835,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/local/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:37.276550+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
},
"capture": {
"actual_captured_pids": [
48835
],
"cleanup": [
{
"pid": 48835,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true,
"outer_receipt_written": true,
"outer_receipt_error": null,
"passed": true
}
}
@@ -0,0 +1,20 @@
{
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-startup",
"conditions": [
true,
true,
true,
true,
true
],
"conditions_checked": 5,
"custom_user_dir_name": "TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime",
"fresh_before_parent_initialize": true,
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-5c050a42664f48b3921c7df430ff816b-impact-runtime/guard-probe",
"profile_writes_before_guard": 0,
"project_settings_persisted": false,
"runtime_settings_only": true,
"verified": true
}
@@ -0,0 +1,18 @@
{
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
}
@@ -0,0 +1,38 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 4237877250,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,70 @@
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
SDL: Init OK!
Using "default" pen tablet driver...
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
CORE API HASH: 2004498165
EDITOR API HASH: 1696660745
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' at thread -1
SceneTreeFTI: traversal method DEFAULT
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
Loaded system CA certificates
PACK_PROFILE_GUARD verified=true
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
NATIVE_ADAPTER_LIBRARY_REGISTERED
Parent reconstruction boundaries: 93 checks, 0 failures
@@ -0,0 +1,39 @@
{
"actual_captured_pids": [
48803
],
"cleanup": [
{
"pid": 48803,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true
}
@@ -0,0 +1,140 @@
{
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"pid": 48803,
"started_utc": "2026-10-12T04:31:32.755887+00:00",
"ended_utc": "2026-10-12T04:31:34.536852+00:00",
"wall_seconds": 1.7799485830000004,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "829ba8e177a70ab087c018ee4d2e80d352efa6a4efc99cdc0ecc7669f7be64a0",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 2464118916,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"started_utc": "2026-10-12T04:31:32.755887+00:00",
"current_process_identity": {
"pid": 48803,
"ppid": 48787,
"pgid": 48803,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 4237877250,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
}
@@ -0,0 +1,40 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 2464118916,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"started_utc": "2026-10-12T04:31:32.755887+00:00",
"current_process_identity": {
"pid": 48803,
"ppid": 48787,
"pgid": 48803,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,74 @@
WorkerThreadPool: 10 threads, 3 max low-priority.
Godot Engine v4.7.2.stable.official.ed1daf0bf - https://godotengine.org
TextServer: Added interface "Dummy"
TextServer: Added interface "ICU / HarfBuzz / Graphite (Built-in)"
SDL: Init OK!
Using "default" pen tablet driver...
TextServer: Primary interface set to: "ICU / HarfBuzz / Graphite (Built-in)".
CORE API HASH: 2004498165
EDITOR API HASH: 1696660745
Loading resource: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd remapped: /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd
Completed load for: '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' remapped '/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd' at thread -1
SceneTreeFTI: traversal method DEFAULT
Loading resource: res://autoload/event_bus.gd remapped: res://autoload/event_bus.gd
Completed load for: 'res://autoload/event_bus.gd' remapped 'res://autoload/event_bus.gd' at thread -1
Loading resource: res://autoload/game_clock.gd remapped: res://autoload/game_clock.gd
Completed load for: 'res://autoload/game_clock.gd' remapped 'res://autoload/game_clock.gd' at thread -1
Loading resource: res://autoload/game_state.gd remapped: res://autoload/game_state.gd
Completed load for: 'res://autoload/game_state.gd' remapped 'res://autoload/game_state.gd' at thread -1
Loading resource: res://autoload/simulation_runtime.gd remapped: res://autoload/simulation_runtime.gd
Completed load for: 'res://autoload/simulation_runtime.gd' remapped 'res://autoload/simulation_runtime.gd' at thread -1
Loaded system CA certificates
PACK_PROFILE_GUARD verified=true
Loading resource: res://data/facilities/adult_private_room.tres remapped: res://data/facilities/adult_private_room.tres
Completed load for: 'res://data/facilities/adult_private_room.tres' remapped 'res://data/facilities/adult_private_room.tres' at thread -1
Loading resource: res://data/facilities/cafeteria.tres remapped: res://data/facilities/cafeteria.tres
Completed load for: 'res://data/facilities/cafeteria.tres' remapped 'res://data/facilities/cafeteria.tres' at thread -1
Loading resource: res://data/facilities/expansion/chapel.tres remapped: res://data/facilities/expansion/chapel.tres
Completed load for: 'res://data/facilities/expansion/chapel.tres' remapped 'res://data/facilities/expansion/chapel.tres' at thread -1
Loading resource: res://data/facilities/expansion/cleaning_room.tres remapped: res://data/facilities/expansion/cleaning_room.tres
Completed load for: 'res://data/facilities/expansion/cleaning_room.tres' remapped 'res://data/facilities/expansion/cleaning_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/premium_room.tres remapped: res://data/facilities/expansion/premium_room.tres
Completed load for: 'res://data/facilities/expansion/premium_room.tres' remapped 'res://data/facilities/expansion/premium_room.tres' at thread -1
Loading resource: res://data/facilities/expansion/staff_dormitory.tres remapped: res://data/facilities/expansion/staff_dormitory.tres
Completed load for: 'res://data/facilities/expansion/staff_dormitory.tres' remapped 'res://data/facilities/expansion/staff_dormitory.tres' at thread -1
Loading resource: res://data/facilities/guest_corridor.tres remapped: res://data/facilities/guest_corridor.tres
Completed load for: 'res://data/facilities/guest_corridor.tres' remapped 'res://data/facilities/guest_corridor.tres' at thread -1
Loading resource: res://data/facilities/guest_elevator.tres remapped: res://data/facilities/guest_elevator.tres
Completed load for: 'res://data/facilities/guest_elevator.tres' remapped 'res://data/facilities/guest_elevator.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/guest_stairs.tres remapped: res://data/facilities/infrastructure/guest_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/guest_stairs.tres' remapped 'res://data/facilities/infrastructure/guest_stairs.tres' at thread -1
Loading resource: res://data/facilities/infrastructure/service_stairs.tres remapped: res://data/facilities/infrastructure/service_stairs.tres
Completed load for: 'res://data/facilities/infrastructure/service_stairs.tres' remapped 'res://data/facilities/infrastructure/service_stairs.tres' at thread -1
Loading resource: res://data/facilities/kitchen.tres remapped: res://data/facilities/kitchen.tres
Completed load for: 'res://data/facilities/kitchen.tres' remapped 'res://data/facilities/kitchen.tres' at thread -1
Loading resource: res://data/facilities/massage_room.tres remapped: res://data/facilities/massage_room.tres
Completed load for: 'res://data/facilities/massage_room.tres' remapped 'res://data/facilities/massage_room.tres' at thread -1
Loading resource: res://data/facilities/public_bath.tres remapped: res://data/facilities/public_bath.tres
Completed load for: 'res://data/facilities/public_bath.tres' remapped 'res://data/facilities/public_bath.tres' at thread -1
Loading resource: res://data/facilities/reception.tres remapped: res://data/facilities/reception.tres
Completed load for: 'res://data/facilities/reception.tres' remapped 'res://data/facilities/reception.tres' at thread -1
Loading resource: res://data/facilities/rescue/infirmary.tres remapped: res://data/facilities/rescue/infirmary.tres
Completed load for: 'res://data/facilities/rescue/infirmary.tres' remapped 'res://data/facilities/rescue/infirmary.tres' at thread -1
Loading resource: res://data/facilities/security_station.tres remapped: res://data/facilities/security_station.tres
Completed load for: 'res://data/facilities/security_station.tres' remapped 'res://data/facilities/security_station.tres' at thread -1
Loading resource: res://data/facilities/service_corridor.tres remapped: res://data/facilities/service_corridor.tres
Completed load for: 'res://data/facilities/service_corridor.tres' remapped 'res://data/facilities/service_corridor.tres' at thread -1
Loading resource: res://data/facilities/service_elevator.tres remapped: res://data/facilities/service_elevator.tres
Completed load for: 'res://data/facilities/service_elevator.tres' remapped 'res://data/facilities/service_elevator.tres' at thread -1
Loading resource: res://data/facilities/staff_door.tres remapped: res://data/facilities/staff_door.tres
Completed load for: 'res://data/facilities/staff_door.tres' remapped 'res://data/facilities/staff_door.tres' at thread -1
Loading resource: res://data/facilities/staff_waiting_room.tres remapped: res://data/facilities/staff_waiting_room.tres
Completed load for: 'res://data/facilities/staff_waiting_room.tres' remapped 'res://data/facilities/staff_waiting_room.tres' at thread -1
Loading resource: res://data/facilities/standard_room.tres remapped: res://data/facilities/standard_room.tres
Completed load for: 'res://data/facilities/standard_room.tres' remapped 'res://data/facilities/standard_room.tres' at thread -1
Loading resource: res://data/facilities/tavern.tres remapped: res://data/facilities/tavern.tres
Completed load for: 'res://data/facilities/tavern.tres' remapped 'res://data/facilities/tavern.tres' at thread -1
Loading resource: res://data/facilities/warehouse.tres remapped: res://data/facilities/warehouse.tres
Completed load for: 'res://data/facilities/warehouse.tres' remapped 'res://data/facilities/warehouse.tres' at thread -1
NATIVE_ADAPTER_LIBRARY_REGISTERED
Parent reconstruction boundaries: 93 checks, 0 failures
XR: Clearing primary interface
XR: Removed interface "Native mobile"
XR: Removed interface "OpenXR"
@@ -0,0 +1,15 @@
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-reconstruction-parent-boundaries-r211.gd"
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
func _initialize() -> void:
if not Guard.activate(): quit(97); return
super._initialize()
func run() -> void:
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
available = available and probe != null and probe.has_method(&"project_guest_candidates")
probe = null
check(available, "exact native guest projection extension registered before diagnostic")
if not available: quit(96); return
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
super.run()
@@ -0,0 +1,23 @@
{
"case_count": 6,
"checks": 93,
"failures": [],
"fixtures": {
"bytes": 836,
"codec": "zstd",
"field_deletions": 0,
"file_envelope": false,
"full_bytes_roundtrip": true,
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-measurement/parent-fixtures.varbytes.zst",
"sha256": "89451d49b00bb0e1df4e1c3e11e599148a5406c45eb58d5c24e026250288c470",
"uncompressed_bytes": 10712,
"uncompressed_sha256": "cddf529394d1e800c53c0ef51292ab33946ef2421449f0169f5d7220683687dd"
},
"limits": [
"Six synthetic valid or permitted-conversion shapes only. Out-of-range/error-generating malformed inputs and arbitrary reentry remain outside this finite acceptance."
],
"passed": true,
"performance_accepted": false,
"pid": 48803,
"unit_accepted": false
}
@@ -0,0 +1,185 @@
{
"name": "parents",
"result": {
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"pid": 48803,
"started_utc": "2026-10-12T04:31:32.755887+00:00",
"ended_utc": "2026-10-12T04:31:34.536852+00:00",
"wall_seconds": 1.7799485830000004,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "829ba8e177a70ab087c018ee4d2e80d352efa6a4efc99cdc0ecc7669f7be64a0",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 2464118916,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"started_utc": "2026-10-12T04:31:32.755887+00:00",
"current_process_identity": {
"pid": 48803,
"ppid": 48787,
"pgid": 48803,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48803,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"monotonic_ns": 4237877250,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48803,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/parents/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:34.535206+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
},
"capture": {
"actual_captured_pids": [
48803
],
"cleanup": [
{
"pid": 48803,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true,
"outer_receipt_written": true,
"outer_receipt_error": null,
"passed": true
}
}
@@ -0,0 +1,20 @@
{
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-startup",
"conditions": [
true,
true,
true,
true,
true
],
"conditions_checked": 5,
"custom_user_dir_name": "TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime",
"fresh_before_parent_initialize": true,
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-956f195b7d424eb4ad8a0cdc374fc1a9-impact-runtime/guard-probe",
"profile_writes_before_guard": 0,
"project_settings_persisted": false,
"runtime_settings_only": true,
"verified": true
}
@@ -0,0 +1,18 @@
{
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
}
@@ -0,0 +1,38 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 20043365916,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,39 @@
{
"actual_captured_pids": [
48887
],
"cleanup": [
{
"pid": 48887,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true
}
@@ -0,0 +1,140 @@
{
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"pid": 48887,
"started_utc": "2026-10-12T04:31:45.343072+00:00",
"ended_utc": "2026-10-12T04:31:50.344666+00:00",
"wall_seconds": 5.001550541,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "15bcd2516627e27cd4a8fc9d12d02dac864c0a6998e6d1298c529161b6724a5d",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 15049963083,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"started_utc": "2026-10-12T04:31:45.343072+00:00",
"current_process_identity": {
"pid": 48887,
"ppid": 48787,
"pgid": 48887,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 20043365916,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
}
@@ -0,0 +1,40 @@
{
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 15049963083,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"started_utc": "2026-10-12T04:31:45.343072+00:00",
"current_process_identity": {
"pid": 48887,
"ppid": 48787,
"pgid": 48887,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
}
@@ -0,0 +1,15 @@
extends "/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-guest-pipeline-runtime-r190.gd"
const Guard := preload("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-cache-public-mutations-r144/profile_guard.gd")
func _initialize() -> void:
if not Guard.activate(): quit(97); return
super._initialize()
func run() -> void:
var loaded := GDExtensionManager.load_extension("/Users/korizatou114/Projects/\u3068\u308a\u306b\u304f\u5de5\u623f\u30b2\u30fc\u30e0\u5236\u4f5c\u90e8/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/candidate.gdextension")
var available := loaded == GDExtensionManager.LOAD_STATUS_OK and ClassDB.class_exists(&"TheTreeNumericCore")
var probe = ClassDB.instantiate(&"TheTreeNumericCore") if available else null
available = available and probe != null and probe.has_method(&"project_guest_candidates")
probe = null
check(available, "exact native guest projection extension registered before diagnostic")
if not available: quit(96); return
print("NATIVE_ADAPTER_LIBRARY_REGISTERED")
super.run()
@@ -0,0 +1,44 @@
{
"Windows_accepted": false,
"after_evaluation": {
"bytes": 240032,
"codec": "zstd",
"field_deletions": 0,
"file_envelope": false,
"full_bytes_roundtrip": true,
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-measurement/after-evaluation.varbytes.zst",
"sha256": "1a88f7ed27d1d32102c6fe3a9533221d2565191712ed15b631190479d1d41505",
"uncompressed_bytes": 11411840,
"uncompressed_sha256": "c0830afde6ca25d8d36b1d61c4dc32f5161eba93a0e76646724645bd61554606"
},
"batch_released": true,
"candidate_adopted": false,
"candidate_count": 150,
"candidates": {
"bytes": 1498,
"codec": "zstd",
"field_deletions": 0,
"file_envelope": false,
"full_bytes_roundtrip": true,
"path": "/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-measurement/candidates.varbytes.zst",
"sha256": "d636067f11f70a82ae7d928d2463bc3c2a4107b1d63d1baaed065c8ef93b87d2",
"uncompressed_bytes": 105808,
"uncompressed_sha256": "3f94a15cb2c508660a2cbdb2558f93be7a1ce50bd6803a0861015d99a6a86a02"
},
"checks": 23,
"failures": [],
"guest_id": "diag.guest.101",
"limits": [
"One selected guest only, no decide or clock progression. No whole647 query reason attribution.",
"Inclusive timers overlap and include instrumentation overhead; do not add them or treat them as production performance budgets.",
"r38 isolated indexed-edges nearest-access batch; empty derived cache after restore, no Main/UI/OS/x3 acceptance."
],
"normal_OS_x3_accepted": false,
"passed": true,
"performance_budget_accepted": false,
"pid": 48887,
"point_query_cache_misses": 184,
"projection_us": 47768,
"start_cell": "(-6, -2, 0)",
"unit_accepted": false
}
@@ -0,0 +1,185 @@
{
"name": "runtime",
"result": {
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"pid": 48887,
"started_utc": "2026-10-12T04:31:45.343072+00:00",
"ended_utc": "2026-10-12T04:31:50.344666+00:00",
"wall_seconds": 5.001550541,
"exit_code": 0,
"helper_exit_code": 0,
"timed_out": false,
"stdout_sha256": "15bcd2516627e27cd4a8fc9d12d02dac864c0a6998e6d1298c529161b6724a5d",
"stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"error_lines": [],
"owned_popen_ended": true,
"old_helper_engine_ended": true,
"start_receipt_written": true,
"end_receipt_written": true,
"lifecycle_error": null,
"old_helper_lifecycle_error": null,
"actual_start_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_STARTED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 15049963083,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"started_utc": "2026-10-12T04:31:45.343072+00:00",
"current_process_identity": {
"pid": 48887,
"ppid": 48787,
"pgid": 48887,
"args": "/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage --script /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd --verbose --log-file /Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
},
"live_identity_exact": true,
"tracked_child_ended_before_initial_probe": false,
"signal_scope": "tracked Popen child only; no external group signal"
},
"actual_end_binding": {
"scope": "isolated diagnostic owned child",
"event": "ENGINE_ENDED",
"actual_pid": 48887,
"owner_pid": 48787,
"command": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"monotonic_ns": 20043365916,
"exit_code": 0,
"actual_process_exit_code": 0,
"engine_ended": true,
"timed_out": false,
"lifecycle_error": null,
"start_receipt_written": true,
"pid": 48887,
"argv": [
"/Applications/Godot.app/Contents/MacOS/Godot",
"--headless",
"--path",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-guest-bulk-local-r315/stage",
"--script",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime-guarded.gd",
"--verbose",
"--log-file",
"/Users/korizatou114/Projects/とりにく工房ゲーム制作部/artifacts/original-completion-2026-10-02/p23-02-native-input-copy-local-r335/runtime/engine-native.log"
],
"ended_utc": "2026-10-12T04:31:50.340817+00:00",
"signal_scope": "tracked Popen child only; no external group signal"
},
"strict_native_diagnostics": {
"errors": [],
"banner_count": 1,
"known_unicode_diagnostic_count": 0,
"unrecognized_unicode_diagnostic_count": 0,
"exit_leak_diagnostic_lines": []
},
"external_process_or_group_signals": 0,
"owned_child_process_helper_sha256": "c007e712c281573254faa1233c2ac92e100ab87393256a6dc096b35283e43037",
"adapter_owned_cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"adapter_error": null,
"old_helper_bytes_preserved": true,
"helper_wait_None_maps_to_actual_timeout_seconds": 5,
"explicit_helper_wait_timeouts_preserved": true,
"additional_cleanup_wait_timeout_seconds": 5,
"additional_cleanup_max_attempts": 3
},
"capture": {
"actual_captured_pids": [
48887
],
"cleanup": [
{
"pid": 48887,
"cleanup": {
"owned_child_created": true,
"engine_ended": true,
"actual_process_exit_code": 0,
"attempts": [
{
"attempt": 1,
"kill_attempted": false,
"wait_timeout_seconds": 5,
"wait_completed": true,
"errors": [],
"poll_before": 0,
"wait_returned_code": 0,
"poll_after": 0
}
],
"errors": []
},
"outer_cleanup_errors": [],
"engine_ended": true,
"outer_maximum_helper_invocations": 3,
"helper_maximum_waits": 3,
"per_wait_timeout_seconds": 5,
"foreign_process_or_group_signals": 0
}
],
"adapter_exception": null,
"all_captured_ended": true,
"outer_cleanup_errors": [],
"foreign_process_or_group_signals": 0,
"all_cleanup_before_outer_receipt": true,
"outer_receipt_written": true,
"outer_receipt_error": null,
"passed": true
}
}
@@ -0,0 +1,20 @@
{
"actual_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
"before": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-startup",
"conditions": [
true,
true,
true,
true,
true
],
"conditions_checked": 5,
"custom_user_dir_name": "TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
"expected_user_data_dir": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime",
"fresh_before_parent_initialize": true,
"globalized_probe": "/Users/korizatou114/Library/Application Support/TheTree-PCK-tests-82cfaa9f87624ba092016ae5ff823103-impact-runtime/guard-probe",
"profile_writes_before_guard": 0,
"project_settings_persisted": false,
"runtime_settings_only": true,
"verified": true
}
@@ -0,0 +1,80 @@
# coding: utf-8
"""One finite cold native guest projection QA against original Runtime golden; no full regression."""
from pathlib import Path
import hashlib, importlib.util, json, os, shutil, subprocess, sys, uuid
sys.dont_write_bytecode=True
R=Path(__file__).resolve().parents[2];A=R/'artifacts/original-completion-2026-10-02'
O=A/'p23-02-native-input-copy-local-r335';D=R/'docs/plans/original-completion-2026-10-02'
NAMES=['IMPLEMENTATION_PLAN.md','PROGRESS_INTEGRATION.md','work_packages.json','progress_snapshot.json']
def mod(name,path):
s=importlib.util.spec_from_file_location(name,path);m=importlib.util.module_from_spec(s);s.loader.exec_module(m);return m
def unpack(ref):
raw=subprocess.run(['/opt/homebrew/bin/zstd','-d','-q','-c',ref['path']],capture_output=True,check=True,timeout=10).stdout
assert len(raw)==ref['uncompressed_bytes'] and hashlib.sha256(raw).hexdigest()==ref['uncompressed_sha256']
return raw
def main():
r=mod('impact_runner',R/'tools/run_all_tests.py');outer=mod('impact_owned',r.SUPPORT/'owned_outer.py');plan=r.read(O/'input.json')
assert not (O/'execution.json').exists()
fixed=plan['pins'];source=r.source_refs(R);player=r.default_player(R);docs={n:r.sha(D/n) for n in NAMES}
assert source==plan['source_before'] and player==plan['default_before'] and docs==plan['doc4_before']
stage=Path(plan['stage']);parent=Path(plan['parent']);public=(stage/'project.godot').read_bytes()
def protect():
assert r.source_refs(R)==source and r.default_player(R)==player and {n:r.sha(D/n) for n in NAMES}==docs
assert r.inventory(parent,stage=True)==plan['expected_stage'] and r.inventory(stage,stage=True)==plan['expected_stage']
assert r.inventory(r.SUPPORT)==plan['support_inventory']
for key,q in fixed.items():
p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256'],key
protect()
review=r.read(Path(fixed['host_review']['path']))
assert not review['blockers'] and review['host_build_accepted']
pre=r.read(A/'p23-02-native-input-copy-local-preexecution-independent-review-r335.json')
assert pre['execution_allowed'] and not pre['blockers']
for group in ('evidence_sha256','canonical_doc4_context_pins'):
for q in pre[group].values():
p=Path(q['path']);assert p.stat().st_size==q['bytes'] and r.sha(p)==q['sha256']
assert r.read(O/'preexecution-root-verification.json')['passed']
phases=[];samples=[];error=None;cleanup=[];cleanup_errors=[]
try:
for spec in plan['specs']:
name=spec['name'];protect()
assert sum(p.stat().st_size for p in O.rglob('*') if p.is_file())<=16*1048576
assert not outer.native.helper['live_engines']() and shutil.disk_usage(A).free >= plan['capacity_floor_bytes']
output=O/(name+'-measurement');output.mkdir();ident=uuid.uuid4().hex
startup='TheTree-PCK-tests-'+ident+'-impact-startup';profile='TheTree-PCK-tests-'+ident+'-impact-runtime'
assert not r.profile_path(startup).exists() and not r.profile_path(profile).exists()
env=r.fresh_environment(os.environ)
env.update(THE_TREE_PACK_PROFILE_NAME=profile,THE_TREE_PACK_PROFILE_EXPECTED=str(r.profile_path(profile)),THE_TREE_PACK_PROFILE_REPORT=str(O/(name+'-profile.json')),THE_TREE_RUNTIME_MONITOR_OUTPUT=str(output),THE_TREE_REPLAY_SNAPSHOT=fixed['fixture']['path'],THE_TREE_CANDIDATE_ORACLE=fixed['oracle']['path'],THE_TREE_PAIRED_CANDIDATE='r333-library334',THE_TREE_PAIRED_SAMPLE=name)
(stage/'project.godot').write_bytes(r.private_project(public,startup));phase=O/name
argv=[fixed['engine']['path'],'--headless','--path',str(stage),'--script',fixed['starter_'+name]['path'],'--verbose','--log-file',str(phase/'engine-native.log')]
result,capture=outer.run_phase(argv,phase,90,env,now_fn=r.now,dump_fn=r.write,sha_fn=r.sha,live_engines_fn=outer.native.helper['live_engines'])
row=dict(name=name,result=result,capture=capture);phases.append(row);r.write(O/(name+'-phase.json'),row)
report_path=output/'report.json';report=r.read(report_path) if report_path.exists() else None
if report is not None:samples.append(dict(name=name,report=report))
assert result is not None and result['exit_code']==0 and not result['error_lines'] and not result['timed_out'] and capture['passed']
logs=''.join((phase/n).read_text() for n in ['stdout.log','stderr.log','engine-native.log'])
assert 'Orphan StringName:' not in logs and 'unclaimed string names' not in logs
assert report and report['passed'] and not report['failures'] and report['pid']==result['pid'] and report['checks']==spec['expected_checks']
assert (phase/'stdout.log').read_text().count(spec['label']+'%d checks, 0 failures'%report['checks'])==1
assert (phase/'stdout.log').read_text().count('NATIVE_ADAPTER_LIBRARY_REGISTERED')==1
r.profile_gate(r.profile_path(profile),O/(name+'-profile.json'),profile)
if name=='runtime':
golden=r.read(Path(fixed['golden_runtime']['path']))
for field in ['candidates','after_evaluation']:assert unpack(report[field])==unpack(golden[field]),field+' full typed golden'
assert report['candidate_count']==150 and report['batch_released']
else:
assert report['case_count']==spec['case_count']
unpack(report['fixtures'])
assert sum(p.stat().st_size for p in O.rglob('*') if p.is_file())<=16*1048576
(stage/'project.godot').write_bytes(public);protect()
except BaseException as caught:error=type(caught).__name__+': '+str(caught)
finally:
cleanup,cleanup_errors=outer.finish_captured(outer.OWNED)
if all(q['engine_ended'] is True for q in cleanup):(stage/'project.godot').write_bytes(public)
else:cleanup_errors.append('Project restoration refused while owned child remains live')
guard_errors=[]
try:protect()
except BaseException as caught:guard_errors.append(type(caught).__name__+': '+str(caught))
passed=error is None and not guard_errors and not cleanup_errors and len(phases)==4 and len(samples)==4
r.write(O/'execution.json',dict(passed=passed,error=error,guard_errors=guard_errors,phases=phases,samples=samples,cleanup=cleanup,cleanup_errors=cleanup_errors,input_source_default_doc4_preserved=not guard_errors,candidate_adopted=False,unit_accepted=False,performance_accepted=False,normal_OS_accepted=False,Windows_accepted=False,limitations=['Four finite local QA engines for r333/library334: six parent shapes,19 nearest paths,4 input-key projection shapes and150 Runtime candidates/full evaluation state. Not invalid-index errors, arbitrary reentry, whole647, performance, full172, OS, Windows or adoption.']))
print(json.dumps(dict(passed=passed,error=error,guard_errors=guard_errors)),flush=True);return 0 if passed else 1
if __name__=='__main__':raise SystemExit(main())

Some files were not shown because too many files have changed in this diff Show More