mirror of
https://github.com/Cesarus85/ringfall-mjolnir-vr.git
synced 2026-10-17 18:00:25 +02:00
Reconcile Claude fifty-object round two
This commit is contained in:
commit
193a68682a
554 files changed
+53829
-500
No files matched your search
+4
-4
@@ -242,9 +242,9 @@
|
||||
},
|
||||
{
|
||||
"unit": "source/bungie_net/network/transport_endpoint_set_winsock",
|
||||
"function": "_transport_endpoint_set_compare_entries",
|
||||
"function": "_poll_ep_array_compare_proc",
|
||||
"class": "unclassified",
|
||||
"evidence": "Natural typed qsort callback reconstructed with its real poll caller. Both entries are loaded, non-NULL entries precede NULL entries, and the callback returns the January -1/0/1 relation. Private semantic name is inferred and mapped to the original target owner at 0x70B10 without an alias or linkage change. Both48B/0relocs; only EAX/ECX assignment differs. No register/declaration-order search or ABI steering. All12 inherited exact owners and the nonce park are unchanged; no candidate-only code or point_from_line3d is emitted. Reopen only for authentic source/type/compiler-context evidence. See docs/object_matching_logs/transport_endpoint_set_winsock_obj_set_operations_cluster_20260904.md.",
|
||||
"evidence": "Natural typed qsort callback reconstructed with its real poll caller. Both entries are loaded, non-NULL entries precede NULL entries, and the callback returns the January -1/0/1 relation. Private semantic name is inferred and mapped to the original target owner at 0x70B10 without an alias or linkage change. Both48B/0relocs; only EAX/ECX assignment differs. No register/declaration-order search or ABI steering. All12 inherited exact owners and the nonce park are unchanged; no candidate-only code or point_from_line3d is emitted. Reopen only for authentic source/type/compiler-context evidence. See docs/object_matching_logs/transport_endpoint_set_winsock_obj_set_operations_cluster_20260904.md. Renamed 2026-09-24 (critic_3) to the first-party Sept-2001 cachebeta.map static name _poll_ep_array_compare_proc: the Sept body is instruction-identical at the same anchor position; the rename is byte-inert.",
|
||||
"measurements": {
|
||||
"target": {"size": 48, "relocation_count": 0, "normalized_sha256": "10d0cbdd04c0ad15a3cd14bffdde707c085ce85c4b9fed4c036fb4c103ca9c55"},
|
||||
"base": {"size": 48, "relocation_count": 0, "normalized_sha256": "6621f23910b74ac690b7593956ec7d8b7feb44be8401480ceaff51642dcd6c1f"},
|
||||
@@ -1318,9 +1318,9 @@
|
||||
},
|
||||
{
|
||||
"unit": "source/bungie_net/network/transport_endpoint_winsock",
|
||||
"function": "_connect_endpoint_process@4",
|
||||
"function": "_connect_async_thread_proc@4",
|
||||
"class": "unclassified",
|
||||
"evidence": "Complete typed asynchronous connect worker reconstructed from the January body. It uses the authentic 40-byte input layout, stdcall thread ABI, mutex/thread owners, real endpoint operations, named errors, and semantic private name. Target and candidate both occupy 304 padded bytes with all 25 relocations. The coherent candidate initializes its deferred thread reference to NULL; reproducing January's stack-slot reuse would require reading an uninitialized local on mutex failure, which house rules reject. The initialized, safe body is therefore retained at zero exact credit. See docs/object_matching_logs/transport_endpoint_winsock_obj_async_leaf_packet_20260913.md.",
|
||||
"evidence": "Complete typed asynchronous connect worker reconstructed from the January body. It uses the authentic 40-byte input layout, stdcall thread ABI, mutex/thread owners, real endpoint operations, named errors, and semantic private name. Target and candidate both occupy 304 padded bytes with all 25 relocations. The coherent candidate initializes its deferred thread reference to NULL; reproducing January's stack-slot reuse would require reading an uninitialized local on mutex failure, which house rules reject. The initialized, safe body is therefore retained at zero exact credit. See docs/object_matching_logs/transport_endpoint_winsock_obj_async_leaf_packet_20260913.md. Renamed 2026-09-24 (critic_3) to the first-party Sept-2001 cachebeta.map static name _connect_async_thread_proc@4: the Sept body is instruction-identical at the same anchor position; the rename is byte-inert.",
|
||||
"measurements": {
|
||||
"target": { "size": 304, "relocation_count": 25, "normalized_sha256": "9533beb1d4e9a53568bc1141902bf2b6de740161acc2225f7a1a9a24838fd276" },
|
||||
"base": { "size": 304, "relocation_count": 25, "normalized_sha256": "124019ea872d584781a0c8424c9fbce31bc491ba51226808716bc6e4335a2062" },
|
||||
|
||||
+91
-91
@@ -601,57 +601,57 @@
|
||||
{ "file_offset": 227120, "flags": 32, "name": "_ai_debug_get_path_storage" },
|
||||
{ "file_offset": 227376, "flags": 32, "name": "_ai_debug_select_encounter" },
|
||||
{ "file_offset": 227456, "flags": 32, "name": "_ai_debug_sound_point_set" },
|
||||
{ "file_offset": 227472, "flags": 32, "name": "_code_00037890" },
|
||||
{ "file_offset": 227600, "flags": 32, "name": "_ai_debug_render_surface" },
|
||||
{ "file_offset": 227472, "flags": 32, "name": "_ai_debug_render_path_line", "static": true },
|
||||
{ "file_offset": 227600, "flags": 32, "name": "_ai_debug_render_surface", "static": true },
|
||||
{ "file_offset": 227776, "flags": 32, "name": "_set_real_point3d" },
|
||||
{ "file_offset": 227808, "flags": 32, "name": "_ai_debug_lineoffire_new" },
|
||||
{ "file_offset": 227904, "flags": 32, "name": "_ai_debug_lineoffire_addpill" },
|
||||
{ "file_offset": 228064, "flags": 32, "name": "_ai_debug_lineoffire_success" },
|
||||
{ "file_offset": 228080, "flags": 32, "name": "_code_00037af0" },
|
||||
{ "file_offset": 228288, "flags": 32, "name": "_code_00037bc0" },
|
||||
{ "file_offset": 228080, "flags": 32, "name": "_ai_debug_render_lineoffire", "static": true },
|
||||
{ "file_offset": 228288, "flags": 32, "name": "_ai_debug_render_ballistic_lineoffire", "static": true },
|
||||
{ "file_offset": 228560, "flags": 32, "name": "_ai_debug_highlight_cluster" },
|
||||
{ "file_offset": 228800, "flags": 32, "name": "_ai_debug_lineofsight_reset" },
|
||||
{ "file_offset": 228816, "flags": 32, "name": "_code_00037dd0" },
|
||||
{ "file_offset": 229088, "flags": 32, "name": "_code_00037ee0" },
|
||||
{ "file_offset": 229280, "flags": 32, "name": "_code_00037fa0" },
|
||||
{ "file_offset": 228816, "flags": 32, "name": "_ai_debug_lineofsight_findpoint", "static": true },
|
||||
{ "file_offset": 229088, "flags": 32, "name": "_ai_debug_lineofsight_storeray", "static": true },
|
||||
{ "file_offset": 229280, "flags": 32, "name": "_ai_debug_render_lineofsight", "static": true },
|
||||
{ "file_offset": 229584, "flags": 32, "name": "_ai_debug_describe_actor" },
|
||||
{ "file_offset": 230016, "flags": 32, "name": "_code_00038280" },
|
||||
{ "file_offset": 230352, "flags": 32, "name": "_code_000383d0" },
|
||||
{ "file_offset": 230016, "flags": 32, "name": "_ai_debug_get_this_actor", "static": true },
|
||||
{ "file_offset": 230352, "flags": 32, "name": "_ai_debug_render_aiming_validity", "static": true },
|
||||
{ "file_offset": 230864, "flags": 32, "name": "_ai_debug_vocalize" },
|
||||
{ "file_offset": 231072, "flags": 32, "name": "_code_000386a0" },
|
||||
{ "file_offset": 231072, "flags": 32, "name": "_ai_debug_speech_update", "static": true },
|
||||
{ "file_offset": 231568, "flags": 32, "name": "_ai_debug_speak" },
|
||||
{ "file_offset": 231680, "flags": 32, "name": "_ai_debug_speak_list" },
|
||||
{ "file_offset": 232144, "flags": 32, "name": "_code_00038ad0" },
|
||||
{ "file_offset": 232144, "flags": 32, "name": "_ai_debug_communication_toggle_bits", "static": true },
|
||||
{ "file_offset": 232640, "flags": 32, "name": "_ai_debug_communication_suppress" },
|
||||
{ "file_offset": 232688, "flags": 32, "name": "_ai_debug_communication_ignore" },
|
||||
{ "file_offset": 232736, "flags": 32, "name": "_ai_debug_communication_focus" },
|
||||
{ "file_offset": 232784, "flags": 32, "name": "_ai_debug_idle_look_clear" },
|
||||
{ "file_offset": 232832, "flags": 32, "name": "_ai_debug_idle_look_addprop" },
|
||||
{ "file_offset": 232928, "flags": 32, "name": "_code_00038de0" },
|
||||
{ "file_offset": 233264, "flags": 32, "name": "_code_00038f30" },
|
||||
{ "file_offset": 233568, "flags": 32, "name": "_code_00039060" },
|
||||
{ "file_offset": 232928, "flags": 32, "name": "_ai_debug_render_idle_look", "static": true },
|
||||
{ "file_offset": 233264, "flags": 32, "name": "_ai_debug_render_spatial_effects", "static": true },
|
||||
{ "file_offset": 233568, "flags": 32, "name": "_ai_debug_path_storage_update", "static": true },
|
||||
{ "file_offset": 233856, "flags": 32, "name": "_ai_debug_update" },
|
||||
{ "file_offset": 235024, "flags": 32, "name": "_ai_debug_change_selected_encounter" },
|
||||
{ "file_offset": 235360, "flags": 32, "name": "_ai_debug_teleport_to" },
|
||||
{ "file_offset": 235552, "flags": 32, "name": "_ai_debug_select_actor" },
|
||||
{ "file_offset": 235664, "flags": 32, "name": "_ai_debug_drawstack_setup" },
|
||||
{ "file_offset": 235808, "flags": 32, "name": "_ai_debug_drawstack" },
|
||||
{ "file_offset": 235920, "flags": 32, "name": "_code_00039990" },
|
||||
{ "file_offset": 236768, "flags": 32, "name": "_ai_debug_highlight_unit" },
|
||||
{ "file_offset": 235664, "flags": 32, "name": "_ai_debug_drawstack_setup", "static": true },
|
||||
{ "file_offset": 235808, "flags": 32, "name": "_ai_debug_drawstack", "static": true },
|
||||
{ "file_offset": 235920, "flags": 32, "name": "_ai_debug_render_path_node", "static": true },
|
||||
{ "file_offset": 236768, "flags": 32, "name": "_ai_debug_highlight_unit", "static": true },
|
||||
{ "file_offset": 237024, "flags": 32, "name": "_ai_debug_lineofsight" },
|
||||
{ "file_offset": 237072, "flags": 32, "name": "_code_00039e10" },
|
||||
{ "file_offset": 237184, "flags": 32, "name": "_code_00039e80" },
|
||||
{ "file_offset": 238304, "flags": 32, "name": "_code_0003a2e0" },
|
||||
{ "file_offset": 237072, "flags": 32, "name": "_ai_debug_select_this_actor", "static": true },
|
||||
{ "file_offset": 237184, "flags": 32, "name": "_ai_debug_render_speech", "static": true },
|
||||
{ "file_offset": 238304, "flags": 32, "name": "_ai_debug_render_vehicles_enterable", "static": true },
|
||||
{ "file_offset": 239456, "flags": 32, "name": "_ai_debug_initialize_for_new_map" },
|
||||
{ "file_offset": 239584, "flags": 32, "name": "_ai_debug_change_selected_actor" },
|
||||
{ "file_offset": 239888, "flags": 32, "name": "_code_0003a910" },
|
||||
{ "file_offset": 240592, "flags": 32, "name": "_ai_debug_render_path_storage" },
|
||||
{ "file_offset": 241408, "flags": 32, "name": "_code_0003af00" },
|
||||
{ "file_offset": 241552, "flags": 32, "name": "_ai_debug_render_actor" },
|
||||
{ "file_offset": 239888, "flags": 32, "name": "_ai_debug_render_path_nodes", "static": true },
|
||||
{ "file_offset": 240592, "flags": 32, "name": "_ai_debug_render_path_storage", "static": true },
|
||||
{ "file_offset": 241408, "flags": 32, "name": "_ai_debug_render_path", "static": true },
|
||||
{ "file_offset": 241552, "flags": 32, "name": "_ai_debug_render_actor", "static": true },
|
||||
{ "file_offset": 266128, "flags": 32, "name": "_ai_debug_render_actor_jmptable" },
|
||||
{ "file_offset": 266528, "flags": 32, "name": "_code_00041120" },
|
||||
{ "file_offset": 266704, "flags": 32, "name": "_code_000411d0" },
|
||||
{ "file_offset": 266784, "flags": 32, "name": "_ai_debug_render_encounter" },
|
||||
{ "file_offset": 266528, "flags": 32, "name": "_ai_debug_render_paths_failed", "static": true },
|
||||
{ "file_offset": 266704, "flags": 32, "name": "_ai_debug_render_all_actors", "static": true },
|
||||
{ "file_offset": 266784, "flags": 32, "name": "_ai_debug_render_encounter", "static": true },
|
||||
{ "file_offset": 269120, "flags": 32, "name": "_ai_debug_render" },
|
||||
{ "file_offset": 269456, "flags": 32, "name": "_ai_profile_initialize" },
|
||||
{ "file_offset": 269488, "flags": 32, "name": "_ai_profile_dispose" },
|
||||
@@ -1366,7 +1366,7 @@
|
||||
{ "file_offset": 459264, "flags": 32, "name": "_transport_address_to_string" },
|
||||
{ "file_offset": 459504, "flags": 32, "name": "_transport_error_to_string" },
|
||||
{ "file_offset": 459808, "flags": 32, "name": "_net_startup_debug" },
|
||||
{ "file_offset": 459824, "flags": 32, "name": "_transport_endpoint_set_get_next_index", "static": true },
|
||||
{ "file_offset": 459824, "flags": 32, "name": "_get_next_available_set_array_index", "static": true },
|
||||
{ "file_offset": 459888, "flags": 32, "name": "_transport_push_key" },
|
||||
{ "file_offset": 460016, "flags": 32, "name": "_transport_pop_key" },
|
||||
{ "file_offset": 460080, "flags": 32, "name": "_transport_get_nonce" },
|
||||
@@ -1381,7 +1381,7 @@
|
||||
{ "file_offset": 461168, "flags": 32, "name": "_transport_network_available" },
|
||||
{ "file_offset": 461184, "flags": 32, "name": "_create_endpoint_set" },
|
||||
{ "file_offset": 461440, "flags": 32, "name": "_delete_endpoint_set" },
|
||||
{ "file_offset": 461584, "flags": 32, "name": "_transport_endpoint_set_compare_entries", "static": true },
|
||||
{ "file_offset": 461584, "flags": 32, "name": "_poll_ep_array_compare_proc", "static": true },
|
||||
{ "file_offset": 461632, "flags": 32, "name": "_poll_endpoint_set" },
|
||||
{ "file_offset": 462192, "flags": 32, "name": "_add_endpoint_to_set" },
|
||||
{ "file_offset": 462528, "flags": 32, "name": "_remove_endpoint_from_set" },
|
||||
@@ -1391,8 +1391,8 @@
|
||||
{ "file_offset": 463104, "flags": 32, "name": "_transport_server_initialize" },
|
||||
{ "file_offset": 463264, "flags": 32, "name": "_transport_server_terminate" },
|
||||
{ "file_offset": 463424, "flags": 32, "name": "_transport_client_start" },
|
||||
{ "file_offset": 463616, "flags": 32, "name": "_connection_thread_list_add", "static": true },
|
||||
{ "file_offset": 463712, "flags": 32, "name": "_connection_thread_list_mark_for_disposal", "static": true },
|
||||
{ "file_offset": 463616, "flags": 32, "name": "_add_connect_thread", "static": true },
|
||||
{ "file_offset": 463712, "flags": 32, "name": "_mark_connection_thread_as_terminated", "static": true },
|
||||
{ "file_offset": 463776, "flags": 32, "name": "_connection_thread_list_maintenance", "static": true },
|
||||
{ "file_offset": 463840, "flags": 32, "name": "_create_transport_endpoint" },
|
||||
{ "file_offset": 463968, "flags": 32, "name": "_get_endpoint_type" },
|
||||
@@ -1406,13 +1406,13 @@
|
||||
{ "file_offset": 465104, "flags": 32, "name": "_get_endpoint_error" },
|
||||
{ "file_offset": 465168, "flags": 32, "name": "_endpoint_equivalent" },
|
||||
{ "file_offset": 465280, "flags": 32, "name": "_winsock_error_to_string" },
|
||||
{ "file_offset": 466848, "flags": 32, "name": "_create_endpoint_socket", "static": true },
|
||||
{ "file_offset": 466848, "flags": 32, "name": "_create_socket", "static": true },
|
||||
{ "file_offset": 467152, "flags": 32, "name": "_get_endpoint_address" },
|
||||
{ "file_offset": 467520, "flags": 32, "name": "_set_endpoint_blocking" },
|
||||
{ "file_offset": 467792, "flags": 32, "name": "_bind_endpoint" },
|
||||
{ "file_offset": 468112, "flags": 32, "name": "_connect_endpoint" },
|
||||
{ "file_offset": 468592, "flags": 32, "name": "_disconnect_endpoint" },
|
||||
{ "file_offset": 468720, "flags": 32, "name": "_connect_endpoint_process@4", "static": true },
|
||||
{ "file_offset": 468720, "flags": 32, "name": "_connect_async_thread_proc@4", "static": true },
|
||||
{ "file_offset": 469024, "flags": 32, "name": "_connect_endpoint_async" },
|
||||
{ "file_offset": 469360, "flags": 32, "name": "_cancel_connect_process" },
|
||||
{ "file_offset": 469520, "flags": 32, "name": "_listen_endpoint" },
|
||||
@@ -1615,25 +1615,25 @@
|
||||
{ "file_offset": 515184, "flags": 32, "name": "_errors_handle" },
|
||||
{ "file_offset": 515216, "flags": 32, "name": "_errors_clear" },
|
||||
{ "file_offset": 515232, "flags": 32, "name": "_profile_initialize" },
|
||||
{ "file_offset": 515360, "flags": 32, "name": "_profile_sections_update", "static": true },
|
||||
{ "file_offset": 515360, "flags": 32, "name": "_profile_internal_step", "static": true },
|
||||
{ "file_offset": 515712, "flags": 32, "name": "_profile_rasterizer_stats" },
|
||||
{ "file_offset": 515744, "flags": 32, "name": "_profile_timesection_subtract", "static": true },
|
||||
{ "file_offset": 515744, "flags": 32, "name": "_profile_timesection_inherit", "static": true },
|
||||
{ "file_offset": 515808, "flags": 32, "name": "_profile_seconds_elapsed" },
|
||||
{ "file_offset": 515824, "flags": 32, "name": "_profile_lapsed_frames" },
|
||||
{ "file_offset": 515888, "flags": 32, "name": "_profile_lapsed_msec" },
|
||||
{ "file_offset": 515920, "flags": 32, "name": "_find_profile_section" },
|
||||
{ "file_offset": 516272, "flags": 32, "name": "_profile_enter_private" },
|
||||
{ "file_offset": 516400, "flags": 32, "name": "_profile_exit_private" },
|
||||
{ "file_offset": 516560, "flags": 32, "name": "_profile_frame_build_string", "static": true },
|
||||
{ "file_offset": 518112, "flags": 32, "name": "_profile_timer_start_at", "static": true },
|
||||
{ "file_offset": 518128, "flags": 32, "name": "_profile_timer_end_at", "static": true },
|
||||
{ "file_offset": 516560, "flags": 32, "name": "_profile_describe_frame", "static": true },
|
||||
{ "file_offset": 518112, "flags": 32, "name": "_profile_timesection_begin", "static": true },
|
||||
{ "file_offset": 518128, "flags": 32, "name": "_profile_timesection_end", "static": true },
|
||||
{ "file_offset": 518208, "flags": 32, "name": "_compare_profile_sections" },
|
||||
{ "file_offset": 518496, "flags": 32, "name": "_profile_dump" },
|
||||
{ "file_offset": 519360, "flags": 32, "name": "_profile_dump_to_file" },
|
||||
{ "file_offset": 519488, "flags": 32, "name": "_profile_frame_dump", "static": true },
|
||||
{ "file_offset": 519616, "flags": 32, "name": "_profile_framedump_flush", "static": true },
|
||||
{ "file_offset": 519680, "flags": 32, "name": "_string_starts_with", "static": true },
|
||||
{ "file_offset": 519728, "flags": 32, "name": "_profile_sections_set_active", "static": true },
|
||||
{ "file_offset": 519488, "flags": 32, "name": "_profile_dump_frame", "static": true },
|
||||
{ "file_offset": 519616, "flags": 32, "name": "_profile_dump_frame_stop", "static": true },
|
||||
{ "file_offset": 519680, "flags": 32, "name": "_string_has_prefix", "static": true },
|
||||
{ "file_offset": 519728, "flags": 32, "name": "_profile_sections_activation", "static": true },
|
||||
{ "file_offset": 519888, "flags": 32, "name": "_profile_sections_activate" },
|
||||
{ "file_offset": 519920, "flags": 32, "name": "_profile_sections_deactivate" },
|
||||
{ "file_offset": 519952, "flags": 32, "name": "_profile_find_frame_value" },
|
||||
@@ -1644,8 +1644,8 @@
|
||||
{ "file_offset": 522240, "flags": 32, "name": "_profile_frame_get_messages" },
|
||||
{ "file_offset": 522384, "flags": 32, "name": "_profile_frame_get_stalls" },
|
||||
{ "file_offset": 522544, "flags": 32, "name": "_profile_rasterizer_stalls" },
|
||||
{ "file_offset": 522688, "flags": 32, "name": "_profile_timer_start", "static": true },
|
||||
{ "file_offset": 522736, "flags": 32, "name": "_profile_timer_end", "static": true },
|
||||
{ "file_offset": 522688, "flags": 32, "name": "_profile_timesection_begin_now", "static": true },
|
||||
{ "file_offset": 522736, "flags": 32, "name": "_profile_timesection_end_now", "static": true },
|
||||
{ "file_offset": 522832, "flags": 32, "name": "_profile_tick_start" },
|
||||
{ "file_offset": 522976, "flags": 32, "name": "_profile_tick_end" },
|
||||
{ "file_offset": 523136, "flags": 32, "name": "_profile_render_start" },
|
||||
@@ -1837,7 +1837,7 @@
|
||||
{ "file_offset": 551920, "flags": 32, "name": "_contrail_new" },
|
||||
{ "file_offset": 552256, "flags": 32, "name": "_contrail_owner_collision" },
|
||||
{ "file_offset": 552384, "flags": 32, "name": "_contrails_update" },
|
||||
{ "file_offset": 552928, "flags": 32, "name": "_decal_verify_neighbors", "static": true },
|
||||
{ "file_offset": 552928, "flags": 32, "name": "_decal_check", "static": true },
|
||||
{ "file_offset": 553232, "flags": 32, "name": "_decal_set_first_decal_index", "static": true },
|
||||
{ "file_offset": 553360, "flags": 32, "name": "_decal_sprite_get_bounds", "static": true },
|
||||
{ "file_offset": 553744, "flags": 32, "name": "_decals_initialize" },
|
||||
@@ -2300,7 +2300,7 @@
|
||||
{ "file_offset": 654768, "flags": 32, "name": "_ctf_weapon_pickup", "static": true },
|
||||
{ "file_offset": 655120, "flags": 32, "name": "_ctf_engine_starting_location_rating", "static": true },
|
||||
{ "file_offset": 655408, "flags": 32, "name": "_king_engine_dispose" },
|
||||
{ "file_offset": 655424, "flags": 32, "name": "_hill_points_to_2d", "static": true },
|
||||
{ "file_offset": 655424, "flags": 32, "name": "_point3d_to_point2d", "static": true },
|
||||
{ "file_offset": 655456, "flags": 32, "name": "_find_hill", "static": true },
|
||||
{ "file_offset": 656304, "flags": 32, "name": "_king_engine_dispose_from_old_map" },
|
||||
{ "file_offset": 656320, "flags": 32, "name": "_king_engine_player_added" },
|
||||
@@ -2592,7 +2592,7 @@
|
||||
{ "file_offset": 695808, "flags": 32, "name": "_player_get_starting_location_count" },
|
||||
{ "file_offset": 695888, "flags": 32, "name": "_player_get_starting_location" },
|
||||
{ "file_offset": 696080, "flags": 32, "name": "_placement_data_set_change_color" },
|
||||
{ "file_offset": 696192, "flags": 32, "name": "_unit_create_starting_weapon", "static": true },
|
||||
{ "file_offset": 696192, "flags": 32, "name": "_create_weapon", "static": true },
|
||||
{ "file_offset": 696304, "flags": 32, "name": "_players_compute_combined_pvs", "static": true },
|
||||
{ "file_offset": 696672, "flags": 32, "name": "_players_compute_local_player_count", "static": true },
|
||||
{ "file_offset": 696704, "flags": 32, "name": "_player_examine_nearby_unit", "static": true },
|
||||
@@ -2905,9 +2905,9 @@
|
||||
{ "file_offset": 725984, "flags": 32, "name": "_profile_sections_deactivate_evaluate", "static": true },
|
||||
{ "file_offset": 726048, "flags": 32, "name": "_profile_graph_toggle_evaluate", "static": true },
|
||||
{ "file_offset": 726112, "flags": 32, "name": "_debug_pvs_evaluate", "static": true },
|
||||
{ "file_offset": 726176, "flags": 32, "name": "_radiosity_start_evaluate", "static": true },
|
||||
{ "file_offset": 726208, "flags": 32, "name": "_radiosity_save_evaluate", "static": true },
|
||||
{ "file_offset": 726240, "flags": 32, "name": "_radiosity_debug_point_evaluate", "static": true },
|
||||
{ "file_offset": 726176, "flags": 32, "name": "_radiosity_hack_start_evaluate", "static": true },
|
||||
{ "file_offset": 726208, "flags": 32, "name": "_radiosity_hack_save_evaluate", "static": true },
|
||||
{ "file_offset": 726240, "flags": 32, "name": "_radiosity_hack_find_point_evaluate", "static": true },
|
||||
{ "file_offset": 726272, "flags": 32, "name": "_ai_profile_change_render_spray_evaluate", "static": true },
|
||||
{ "file_offset": 726304, "flags": 32, "name": "_ai_debug_sound_point_set_evaluate", "static": true },
|
||||
{ "file_offset": 726336, "flags": 32, "name": "_ai_debug_vocalize_evaluate", "static": true },
|
||||
@@ -3142,7 +3142,7 @@
|
||||
{ "file_offset": 754400, "flags": 32, "name": "_hs_parse_debug_string" },
|
||||
{ "file_offset": 754672, "flags": 32, "name": "_hs_compile_expression" },
|
||||
{ "file_offset": 755280, "flags": 32, "name": "_hs_compile" },
|
||||
{ "file_offset": 755600, "flags": 32, "name": "_hs_compile_finish" },
|
||||
{ "file_offset": 755600, "flags": 32, "name": "_hs_compile_finish", "static": true },
|
||||
{ "file_offset": 755856, "flags": 32, "name": "_hs_compile_dispose" },
|
||||
{ "file_offset": 756064, "flags": 32, "name": "_hs_not" },
|
||||
{ "file_offset": 756080, "flags": 32, "name": "_hs_print" },
|
||||
@@ -3217,7 +3217,7 @@
|
||||
{ "file_offset": 763152, "flags": 32, "name": "_hs_cast" },
|
||||
{ "file_offset": 763344, "flags": 32, "name": "_hs_global_reconcile_read", "static": true },
|
||||
{ "file_offset": 764752, "flags": 32, "name": "_hs_global_reconcile_write", "static": true },
|
||||
{ "file_offset": 765152, "flags": 32, "name": "_hs_runtime_recompile_error", "static": true },
|
||||
{ "file_offset": 765152, "flags": 32, "name": "_script_error", "static": true },
|
||||
{ "file_offset": 765216, "flags": 32, "name": "_hs_runtime_get_executing_thread_name" },
|
||||
{ "file_offset": 765248, "flags": 32, "name": "_hs_wake_by_name" },
|
||||
{ "file_offset": 765280, "flags": 32, "name": "_render_debug_scripting" },
|
||||
@@ -3607,7 +3607,7 @@
|
||||
{ "file_offset": 856288, "flags": 32, "name": "_IDirect3DDevice8_SetTransform@12" },
|
||||
{ "file_offset": 856304, "flags": 32, "name": "_IDirect3DDevice8_GetTransform@12" },
|
||||
{ "file_offset": 856320, "flags": 32, "name": "_tgaLoad" },
|
||||
{ "file_offset": 856400, "flags": 32, "name": "_progress_bar_screen_initialized" },
|
||||
{ "file_offset": 856400, "flags": 32, "name": "_progress_bar_is_stuff_ready" },
|
||||
{ "file_offset": 856416, "flags": 32, "name": "_IDirect3DDevice8_SetRenderState@12" },
|
||||
{ "file_offset": 856960, "flags": 32, "name": "_IDirect3DDevice8_SetTexture@12" },
|
||||
{ "file_offset": 856976, "flags": 32, "name": "_IDirect3DDevice8_SetTextureStageState@16" },
|
||||
@@ -3628,26 +3628,26 @@
|
||||
{ "file_offset": 857840, "flags": 32, "name": "_IDirect3DDevice8_End@4" },
|
||||
{ "file_offset": 857856, "flags": 32, "name": "_gen_cloud_coord" },
|
||||
{ "file_offset": 857904, "flags": 32, "name": "_gen_mask_coord" },
|
||||
{ "file_offset": 857968, "flags": 32, "name": "_draw_gravy_layer", "static": true },
|
||||
{ "file_offset": 858320, "flags": 32, "name": "_draw_gravy_screen_layer" },
|
||||
{ "file_offset": 858416, "flags": 32, "name": "_draw_gravy_base_layer", "static": true },
|
||||
{ "file_offset": 858512, "flags": 32, "name": "_progress_bar_alias_surface_texture", "static": true },
|
||||
{ "file_offset": 858560, "flags": 32, "name": "_set_blur_texture_coordinates" },
|
||||
{ "file_offset": 858720, "flags": 32, "name": "_draw_fullscreen_blur" },
|
||||
{ "file_offset": 857968, "flags": 32, "name": "_draw_layer_int", "static": true },
|
||||
{ "file_offset": 858320, "flags": 32, "name": "_draw_layer" },
|
||||
{ "file_offset": 858416, "flags": 32, "name": "_draw_initial_layer", "static": true },
|
||||
{ "file_offset": 858512, "flags": 32, "name": "_this_is_awful", "static": true },
|
||||
{ "file_offset": 858560, "flags": 32, "name": "_do_convoluation_coords" },
|
||||
{ "file_offset": 858720, "flags": 32, "name": "_draw_fade_layer" },
|
||||
{ "file_offset": 859024, "flags": 32, "name": "_progress_bar_enable" },
|
||||
{ "file_offset": 859040, "flags": 32, "name": "_D3DTexture_UnlockRect@8" },
|
||||
{ "file_offset": 859056, "flags": 32, "name": "_IDirect3DResource8_Release@4" },
|
||||
{ "file_offset": 859056, "flags": 32, "name": "_IDirect3DTexture8_Release@4" },
|
||||
{ "file_offset": 859072, "flags": 32, "name": "_IDirect3DTexture8_GetLevelDesc@12" },
|
||||
{ "file_offset": 859088, "flags": 32, "name": "_IDirect3DTexture8_LockRect@20" },
|
||||
{ "file_offset": 859120, "flags": 32, "name": "_IDirect3DTexture8_UnlockRect@8" },
|
||||
{ "file_offset": 859136, "flags": 32, "name": "_D3DXMatrixIdentity" },
|
||||
{ "file_offset": 859200, "flags": 32, "name": "_SetRenderStateSmart" },
|
||||
{ "file_offset": 859792, "flags": 32, "name": "_SetTextureStageStateSmart" },
|
||||
{ "file_offset": 859904, "flags": 32, "name": "_progress_bar_draw", "static": true },
|
||||
{ "file_offset": 859904, "flags": 32, "name": "_progress_bar_render", "static": true },
|
||||
{ "file_offset": 861104, "flags": 32, "name": "_progress_bar_load_loading_texture", "static": true },
|
||||
{ "file_offset": 861280, "flags": 32, "name": "_progress_bar_build_glow_texture", "static": true },
|
||||
{ "file_offset": 861280, "flags": 32, "name": "_progress_bar_create_mask_texture", "static": true },
|
||||
{ "file_offset": 861488, "flags": 32, "name": "_progress_bar_eachframe" },
|
||||
{ "file_offset": 861680, "flags": 32, "name": "_progress_bar_setup", "static": true },
|
||||
{ "file_offset": 861680, "flags": 32, "name": "_progress_bar_make_stuff_ready", "static": true },
|
||||
{ "file_offset": 862848, "flags": 32, "name": "_progress_bar_display" },
|
||||
{ "file_offset": 863008, "flags": 32, "name": "_terminal_initialize" },
|
||||
{ "file_offset": 863072, "flags": 32, "name": "_terminal_dispose" },
|
||||
@@ -4104,7 +4104,7 @@
|
||||
{ "file_offset": 981088, "flags": 32, "name": "_main_get_multiplayer_map_name" },
|
||||
{ "file_offset": 981104, "flags": 32, "name": "_main_set_difficulty" },
|
||||
{ "file_offset": 981136, "flags": 32, "name": "_main_get_difficulty" },
|
||||
{ "file_offset": 981152, "flags": 32, "name": "_sort_controllers_ascending", "static": true },
|
||||
{ "file_offset": 981152, "flags": 32, "name": "_sort_desired_local_player_controllers", "static": true },
|
||||
{ "file_offset": 981216, "flags": 32, "name": "_create_local_players", "static": true },
|
||||
{ "file_offset": 981680, "flags": 32, "name": "_main_reset_map" },
|
||||
{ "file_offset": 981712, "flags": 32, "name": "_main_revert_map" },
|
||||
@@ -4850,14 +4850,14 @@
|
||||
{ "file_offset": 1146384, "flags": 32, "name": "_network_connection_server_accept_client_connection" },
|
||||
{ "file_offset": 1146544, "flags": 32, "name": "_network_connection_active" },
|
||||
{ "file_offset": 1146608, "flags": 32, "name": "_network_connection_going_stale" },
|
||||
{ "file_offset": 1146672, "flags": 32, "name": "_network_connection_read_unreliable", "static": true },
|
||||
{ "file_offset": 1147184, "flags": 32, "name": "_network_connection_notify_traffic_event", "static": true },
|
||||
{ "file_offset": 1146672, "flags": 32, "name": "_network_client_unreliable_connection_read", "static": true },
|
||||
{ "file_offset": 1147184, "flags": 32, "name": "_network_connection_log_traffic_event", "static": true },
|
||||
{ "file_offset": 1148272, "flags": 32, "name": "_network_connection_keep_alive" },
|
||||
{ "file_offset": 1148288, "flags": 32, "name": "_network_connection_delete" },
|
||||
{ "file_offset": 1148496, "flags": 32, "name": "_network_connection_write" },
|
||||
{ "file_offset": 1149312, "flags": 32, "name": "_network_server_close_client_connection" },
|
||||
{ "file_offset": 1149632, "flags": 32, "name": "_network_connection_new_serverside_client", "static": true },
|
||||
{ "file_offset": 1149760, "flags": 32, "name": "_network_connection_read_reliable", "static": true },
|
||||
{ "file_offset": 1149632, "flags": 32, "name": "_network_connection_create_client_from_endpoint", "static": true },
|
||||
{ "file_offset": 1149760, "flags": 32, "name": "_network_client_reliable_connection_read", "static": true },
|
||||
{ "file_offset": 1150240, "flags": 32, "name": "_network_connection_idle_client_reliable_endpoint", "static": true },
|
||||
{ "file_offset": 1150720, "flags": 32, "name": "_network_connection_new" },
|
||||
{ "file_offset": 1151296, "flags": 32, "name": "_network_connection_read" },
|
||||
@@ -5717,7 +5717,7 @@
|
||||
{ "file_offset": 1371744, "flags": 32, "name": "_IDirect3DDevice8_Begin@8", "static": true },
|
||||
{ "file_offset": 1371760, "flags": 32, "name": "_IDirect3DDevice8_End@4", "static": true },
|
||||
{ "file_offset": 1371776, "flags": 32, "name": "__rasterizer_dynamic_unlit_geometry_draw" },
|
||||
{ "file_offset": 1372400, "flags": 32, "name": "_rasterizer_screen_geometry_submit_vertex", "static": true },
|
||||
{ "file_offset": 1372400, "flags": 32, "name": "_submit_screen_vertex", "static": true },
|
||||
{ "file_offset": 1372464, "flags": 32, "name": "__rasterizer_psuedo_dynamic_screen_quad_draw" },
|
||||
{ "file_offset": 1375424, "flags": 32, "name": "_D3DDevice_SetRenderState" },
|
||||
{ "file_offset": 1375856, "flags": 32, "name": "_D3DDevice_SetTextureStageState" },
|
||||
@@ -5783,7 +5783,7 @@
|
||||
{ "file_offset": 1398800, "flags": 32, "name": "_rasterizer_environment_fog_screen_model_end" },
|
||||
{ "file_offset": 1398816, "flags": 32, "name": "_set_real_vector4d" },
|
||||
{ "file_offset": 1398848, "flags": 32, "name": "_local_random_boolean" },
|
||||
{ "file_offset": 1398880, "flags": 32, "name": "_rasterizer_environment_fog_screen_active", "static": true },
|
||||
{ "file_offset": 1398880, "flags": 32, "name": "_rasterizer_environment_fog_screen_is_active", "static": true },
|
||||
{ "file_offset": 1399392, "flags": 32, "name": "_rasterizer_environment_fog_screen_wind_update", "static": true },
|
||||
{ "file_offset": 1399888, "flags": 32, "name": "__rasterizer_environment_fog_begin" },
|
||||
{ "file_offset": 1401056, "flags": 32, "name": "__rasterizer_environment_fog_screen_begin" },
|
||||
@@ -5807,7 +5807,7 @@
|
||||
{ "file_offset": 1408320, "flags": 32, "name": "_IDirect3DCubeTexture8_UnlockRect@12", "static": true },
|
||||
{ "file_offset": 1408336, "flags": 32, "name": "_rasterizer_bitmap_2d_changed", "static": true },
|
||||
{ "file_offset": 1408784, "flags": 32, "name": "_rasterizer_bitmap_3d_changed", "static": true },
|
||||
{ "file_offset": 1409312, "flags": 32, "name": "_rasterizer_bitmap_cube_map_changed", "static": true },
|
||||
{ "file_offset": 1409312, "flags": 32, "name": "_rasterizer_bitmap_cm_changed", "static": true },
|
||||
{ "file_offset": 1409840, "flags": 32, "name": "_rasterizer_bitmap_delete" },
|
||||
{ "file_offset": 1409888, "flags": 32, "name": "_rasterizer_bitmap_changed" },
|
||||
{ "file_offset": 1410064, "flags": 32, "name": "_IDirect3DDevice8_CreateVertexBuffer@24" },
|
||||
@@ -5874,10 +5874,10 @@
|
||||
{ "file_offset": 1435344, "flags": 32, "name": "_IDirect3DDevice8_SetTextureStageState@16" },
|
||||
{ "file_offset": 1435440, "flags": 32, "name": "_IDirect3DDevice8_SetVertexShaderConstant@16" },
|
||||
{ "file_offset": 1435456, "flags": 32, "name": "_rasterizer_plasma_energy_draw" },
|
||||
{ "file_offset": 1436880, "flags": 32, "name": "_rasterizer_profile_check", "static": true },
|
||||
{ "file_offset": 1437008, "flags": 32, "name": "_rasterizer_profile_callback", "static": true },
|
||||
{ "file_offset": 1437280, "flags": 32, "name": "_rasterizer_profile_frame_callback", "static": true },
|
||||
{ "file_offset": 1437424, "flags": 32, "name": "_rasterizer_profile_active", "static": true },
|
||||
{ "file_offset": 1436880, "flags": 32, "name": "_profile_assert", "static": true },
|
||||
{ "file_offset": 1437008, "flags": 32, "name": "_callback_function", "static": true },
|
||||
{ "file_offset": 1437280, "flags": 32, "name": "_frame_callback_function", "static": true },
|
||||
{ "file_offset": 1437424, "flags": 32, "name": "_rasterizer_profile_enabled", "static": true },
|
||||
{ "file_offset": 1437456, "flags": 32, "name": "_rasterizer_profile_initialize" },
|
||||
{ "file_offset": 1437568, "flags": 32, "name": "_rasterizer_profile_frame_begin" },
|
||||
{ "file_offset": 1437904, "flags": 32, "name": "_rasterizer_profile_window_begin" },
|
||||
@@ -6203,7 +6203,7 @@
|
||||
{ "file_offset": 1508192, "flags": 32, "name": "_compress_real_vector3d_to_int32_clamp" },
|
||||
{ "file_offset": 1508704, "flags": 32, "name": "_rasterizer_geometry_compress_vertices" },
|
||||
{ "file_offset": 1509440, "flags": 32, "name": "_screenshot_in_progress", "static": true },
|
||||
{ "file_offset": 1509488, "flags": 32, "name": "_lens_flare_submit_parameter_get", "static": true },
|
||||
{ "file_offset": 1509488, "flags": 32, "name": "_lens_flare_parameters_get", "static": true },
|
||||
{ "file_offset": 1509552, "flags": 32, "name": "_lens_flare_occlusion_test_results_get", "static": true },
|
||||
{ "file_offset": 1509792, "flags": 32, "name": "_rasterizer_lights_reset_for_new_map" },
|
||||
{ "file_offset": 1509840, "flags": 32, "name": "_rasterizer_lights_begin_for_new_frame" },
|
||||
@@ -6280,7 +6280,7 @@
|
||||
{ "file_offset": 1525488, "flags": 32, "name": "_render_window", "static": true },
|
||||
{ "file_offset": 1526496, "flags": 32, "name": "_render_player_frame", "static": true },
|
||||
{ "file_offset": 1527504, "flags": 32, "name": "_render_frame" },
|
||||
{ "file_offset": 1527744, "flags": 32, "name": "_render_camera_check_warning_condition", "static": true },
|
||||
{ "file_offset": 1527744, "flags": 32, "name": "_render_camera_warn_once", "static": true },
|
||||
{ "file_offset": 1527904, "flags": 32, "name": "_render_camera_new" },
|
||||
{ "file_offset": 1527936, "flags": 32, "name": "_render_camera_hack_frustum_z" },
|
||||
{ "file_offset": 1528224, "flags": 32, "name": "_render_camera_build_frustum_bounds" },
|
||||
@@ -7221,7 +7221,7 @@
|
||||
{ "file_offset": 1760304, "flags": 32, "name": "_sound_cache_sound_hardware_unlock" },
|
||||
{ "file_offset": 1760352, "flags": 32, "name": "_sound_cache_locked_block_proc", "static": true },
|
||||
{ "file_offset": 1760416, "flags": 32, "name": "_sound_cache_delete_block_proc", "static": true },
|
||||
{ "file_offset": 1760608, "flags": 32, "name": "_sound_cache_debug_block_name", "static": true },
|
||||
{ "file_offset": 1760608, "flags": 32, "name": "_cache_block_get_sound_permutation_name", "static": true },
|
||||
{ "file_offset": 1760672, "flags": 32, "name": "_sound_cache_start_loading_sound", "static": true },
|
||||
{ "file_offset": 1760976, "flags": 32, "name": "_sound_cache_new" },
|
||||
{ "file_offset": 1761152, "flags": 32, "name": "_sound_cache_flush" },
|
||||
@@ -7347,7 +7347,7 @@
|
||||
{ "file_offset": 1780384, "flags": 32, "name": "_saved_game_file_remember_last_used_multiplayer_map" },
|
||||
{ "file_offset": 1780592, "flags": 32, "name": "_saved_game_file_retrieve_last_used_multiplayer_map" },
|
||||
{ "file_offset": 1780816, "flags": 32, "name": "_saved_game_file_generate_checksum" },
|
||||
{ "file_offset": 1780960, "flags": 32, "name": "_find_or_create_directory", "static": true },
|
||||
{ "file_offset": 1780960, "flags": 32, "name": "_find_and_create_directory_if_necessary", "static": true },
|
||||
{ "file_offset": 1781056, "flags": 32, "name": "_enumerate_mapfile_begin", "static": true },
|
||||
{ "file_offset": 1781264, "flags": 32, "name": "_enumerate_mapfile_end", "static": true },
|
||||
{ "file_offset": 1781408, "flags": 32, "name": "_append_entry_to_mapfile", "static": true },
|
||||
@@ -7360,8 +7360,8 @@
|
||||
{ "file_offset": 1782272, "flags": 32, "name": "_build_saved_game_file_index", "static": true },
|
||||
{ "file_offset": 1782336, "flags": 32, "name": "_saved_game_files_initialize" },
|
||||
{ "file_offset": 1782720, "flags": 32, "name": "_saved_game_file_find_profile_index_for_directory_path" },
|
||||
{ "file_offset": 1783072, "flags": 32, "name": "_enumerate_default_playlist_profile_files", "static": true },
|
||||
{ "file_offset": 1783600, "flags": 32, "name": "_enumerate_default_player_profile_files", "static": true },
|
||||
{ "file_offset": 1783072, "flags": 32, "name": "_enumerate_default_playlist_profiles", "static": true },
|
||||
{ "file_offset": 1783600, "flags": 32, "name": "_enumerate_default_player_profiles", "static": true },
|
||||
{ "file_offset": 1784112, "flags": 32, "name": "_get_nth_entry_in_mapfile", "static": true },
|
||||
{ "file_offset": 1784608, "flags": 32, "name": "_set_nth_entry_in_mapfile", "static": true },
|
||||
{ "file_offset": 1785088, "flags": 32, "name": "_add_new_entry_to_mapfile", "static": true },
|
||||
@@ -7371,7 +7371,7 @@
|
||||
{ "file_offset": 1786688, "flags": 32, "name": "_saved_game_file_open" },
|
||||
{ "file_offset": 1787008, "flags": 32, "name": "_synchronize_metadata_display_name_with_profile_name" },
|
||||
{ "file_offset": 1788048, "flags": 32, "name": "_saved_game_file_get_path_to_enclosing_directory" },
|
||||
{ "file_offset": 1788416, "flags": 32, "name": "_saved_game_files_enumerate_default_files" },
|
||||
{ "file_offset": 1788416, "flags": 32, "name": "_enumerate_default_profiles" },
|
||||
{ "file_offset": 1788448, "flags": 32, "name": "_saved_game_files_delete_all_custom_profiles" },
|
||||
{ "file_offset": 1788672, "flags": 32, "name": "_enumerate_memory_units" },
|
||||
{ "file_offset": 1789664, "flags": 32, "name": "_saved_game_files_enumerate_available_to_local_player_index" },
|
||||
@@ -7397,7 +7397,7 @@
|
||||
{ "file_offset": 1793312, "flags": 32, "name": "_bink_decompress_video_frame", "static": true },
|
||||
{ "file_offset": 1793424, "flags": 32, "name": "_bink_playback_stop" },
|
||||
{ "file_offset": 1793536, "flags": 32, "name": "_bink_playback_dispose" },
|
||||
{ "file_offset": 1793584, "flags": 32, "name": "_bink_playback_idle", "static": true },
|
||||
{ "file_offset": 1793584, "flags": 32, "name": "_bink_playback_update__internal", "static": true },
|
||||
{ "file_offset": 1793744, "flags": 32, "name": "_bink_playback_render" },
|
||||
{ "file_offset": 1793840, "flags": 32, "name": "_bink_playback_start" },
|
||||
{ "file_offset": 1794912, "flags": 32, "name": "_bink_playback_update" },
|
||||
@@ -16252,9 +16252,9 @@
|
||||
{ "file_offset": 2531152, "flags": 0, "name": "??_C@_0DE@GGJDPECD@you?5can?8t?5add?5an?5hs?5type?5without@" },
|
||||
{ "file_offset": 2531204, "flags": 0, "name": "??_C@_04ENHBHKMJ@?$CI?$CFs?$CJ?$AA@" },
|
||||
{ "file_offset": 2531212, "flags": 0, "name": "??_C@_08POBEIOG@?$CIset?5?$CFs?$CJ?$AA@" },
|
||||
{ "file_offset": 2531224, "flags": 0, "name": "_whitespace_characters", "static": true },
|
||||
{ "file_offset": 2531228, "flags": 0, "name": "_eol_characters", "static": true },
|
||||
{ "file_offset": 2531232, "flags": 0, "name": "_hs_type_primitive_parsers", "static": true },
|
||||
{ "file_offset": 2531224, "flags": 0, "name": "_whitespace_characters" },
|
||||
{ "file_offset": 2531228, "flags": 0, "name": "_eol_characters" },
|
||||
{ "file_offset": 2531232, "flags": 0, "name": "_hs_type_primitive_parsers" },
|
||||
{ "file_offset": 2531428, "flags": 0, "name": "??_C@_0DI@FFMILLMF@this?5argument?5to?5cond?5should?5be?5@" },
|
||||
{ "file_offset": 2531484, "flags": 0, "name": "??_C@_0CG@CKIGEJPJ@this?5argument?5to?5cond?5needs?5a?5re@" },
|
||||
{ "file_offset": 2531524, "flags": 0, "name": "??_C@_0CD@IJMPPEHP@i?5couldn?8t?5allocate?5a?5syntax?5nod@" },
|
||||
@@ -22342,9 +22342,9 @@
|
||||
{ "file_offset": 2847528, "flags": 0, "name": "_global_communication_team_names" },
|
||||
{ "file_offset": 2847544, "flags": 0, "name": "_global_communication_type_names" },
|
||||
{ "file_offset": 2847772, "flags": 0, "name": "_global_ai_debug_firing_position_color_count" },
|
||||
{ "file_offset": 2847776, "flags": 0, "name": "_postcombat_type_strings" },
|
||||
{ "file_offset": 2847820, "flags": 0, "name": "_global_ai_debug_selected_squad_index" },
|
||||
{ "file_offset": 2847824, "flags": 0, "name": "_global_ai_debug_selected_squad_time" },
|
||||
{ "file_offset": 2847776, "flags": 0, "name": "_postcombat_type_strings", "static": true },
|
||||
{ "file_offset": 2847820, "flags": 0, "name": "_global_ai_debug_selected_squad_index", "static": true },
|
||||
{ "file_offset": 2847824, "flags": 0, "name": "_global_ai_debug_selected_squad_time", "static": true },
|
||||
{ "file_offset": 2847832, "flags": 0, "name": "_global_ai_meter_definitions" },
|
||||
{ "file_offset": 2848056, "flags": 0, "name": "_ai_profile_render_spray_names", "static": true },
|
||||
{ "file_offset": 2848068, "flags": 0, "name": "_global_ai_default_state_names" },
|
||||
@@ -22901,7 +22901,7 @@
|
||||
{ "file_offset": 3251372, "flags": 0, "name": "_global_dialogue_events" },
|
||||
{ "file_offset": 3251376, "flags": 0, "name": "_global_reply_event_count" },
|
||||
{ "file_offset": 3251380, "flags": 0, "name": "_global_reply_events" },
|
||||
{ "file_offset": 3251384, "flags": 0, "name": "_global_ai_debug_activation_cluster_bit_vector" },
|
||||
{ "file_offset": 3251384, "flags": 0, "name": "_global_ai_debug_activation_cluster_bit_vector", "static": true },
|
||||
{ "file_offset": 3251448, "flags": 0, "name": "_actor_debug_array" },
|
||||
{ "file_offset": 3251452, "flags": 0, "name": "_actor_path_debug_array" },
|
||||
{ "file_offset": 3251456, "flags": 0, "name": "_global_ai_debug_path_render_id", "static": true },
|
||||
|
||||
@@ -251,3 +251,102 @@ in `research/fifty_objects_r2_20260924/w/record_synthesis/`):
|
||||
| +2 or +3 | closes with nothing added |
|
||||
| +1, +4, +5 | closes with MN, PU or both |
|
||||
| anything else | needs owner-decision compensators |
|
||||
|
||||
## Canonical checkpoint 4d1ebf17 (merged as cf3a1a6a)
|
||||
|
||||
Canonical cherry-picked this lane's f6d00a8c..5d3ca708 range and **held the
|
||||
rasterizer_xbox_hardware_geometry admission**. The 2001 maps support the wrapper names, but the
|
||||
added `D3DVertexBuffer_MoveResourceMemory(d3d_vertex_buffer, D3DMEM_VIDEO)` call has an unattested
|
||||
position and argument. Canonical also added an isolated Xbox link probe (`tools/link_probe.py`) and
|
||||
private-helper ownership repairs (20dd67c0).
|
||||
|
||||
This lane merged 4d1ebf17 with canonical's exact tree, so the hold is respected. **The corrected
|
||||
object count is 383, not 384.**
|
||||
|
||||
## Completeness critic and batch R2-3 (b9930521)
|
||||
|
||||
An independent critic found five routes with concrete evidence. The main one was that the
|
||||
2001-09-25 linker maps name static functions that still carried placeholder or invented names in
|
||||
21 incomplete objects. Twenty-two adversarial reviews approved 22 of 22 packets. The last 10 ran
|
||||
concurrently at the user's direction, and one interrupted review was re-run from scratch.
|
||||
|
||||
Landed, all zero credit:
|
||||
|
||||
- **72 first-party static-function renames across 20 objects.** Each has map alignment,
|
||||
relocation-masked body identity and matching callers, and each row is absent from cachebeta
|
||||
publics. The hs radiosity pairing is proven by the Sept `.rdata` definition pointers.
|
||||
- **hs_compile storage:** three tables external, `hs_compile_finish` static with a TU-local
|
||||
prototype.
|
||||
- **bink_playback:** `bink_playback_update__internal`.
|
||||
|
||||
Held: bink `bink_decompress_audio_frame`. Landing it needs an added call with an unattested
|
||||
position, which is the class canonical held for hardware_geometry.
|
||||
|
||||
Gate: objects 383, code and data unchanged, 0 regressions, parks 83/0/0, pytest 1,161.
|
||||
|
||||
## Round-2 handoff
|
||||
|
||||
**Base / tip.**
|
||||
|
||||
- Base: canonical f6d00a8c.
|
||||
- Merged canonical 4d1ebf17 at cf3a1a6a.
|
||||
- Tip: this commit, on branch `claude/fifty-objects-r2-20260924`.
|
||||
- Local only; never pushed.
|
||||
- Scorer: objdiff 3.3.1 (sha1 3130e428) throughout.
|
||||
|
||||
**Target vs result.**
|
||||
|
||||
- **Target: 50 new complete Halo objects. Verified: 2** (381 -> 383): ai/actors (new code) and
|
||||
cache/xbox_texture_cache (first-party ownership plus shared-header fixes).
|
||||
- A third, rasterizer_xbox_hardware_geometry, is held by canonical.
|
||||
|
||||
The evidence does not support 50. Every one of the 86 open objects was triaged:
|
||||
|
||||
- the retirements cite exhausting negatives;
|
||||
- the precedent audit found no uncovered admission;
|
||||
- the record-count census closes 1 of 126 residuals, and no object;
|
||||
- the remaining pool is owner-gated (see the owner escalation table), Codex-reserved, or a
|
||||
recorded tie.
|
||||
|
||||
| Tally (vs f6d00a8c) | Value |
|
||||
|---|---|
|
||||
| 1. Net newly complete Halo objects | **2** (actors, xbox_texture_cache) |
|
||||
| 2. New strict functions | **3**: `_actor_input_update` 2,384; `_actors_spawn_from_unit` 672; `_render_debug_trigger_volumes` 1,088 |
|
||||
| 3. New meaningful exact code bytes | **4,128** |
|
||||
| 4. New padded exact code bytes | **4,144** |
|
||||
| 5. New verified data bytes / admission-only closures | **3,089** (projectiles 1,548; object_lights 1,541) / **1** (xbox_texture_cache) |
|
||||
| 6. Fuzzy improvements at zero credit | none landed; zero-credit candidates are preserved in the research copy |
|
||||
| Scorer-only effects | none (objdiff 3.6.0 would additionally credit hs 54,780 and actions 2,404 data bytes; not taken) |
|
||||
| Regressions / revocations | 0 / 0 (hardware_geometry was quarantined before canonical credit, not revoked) |
|
||||
|
||||
**Landed zero-credit hygiene** (makes objects' admission state truthful):
|
||||
|
||||
- storage and ownership for bink_playback, weapons, object_lights, vehicles,
|
||||
weather_particle_systems, rasterizer_xbox_debug, draw_string, render_debug and
|
||||
rasterizer_xbox_profile;
|
||||
- 72 first-party renames in 20 objects;
|
||||
- hs_compile storage;
|
||||
- hs_runtime converter storage.
|
||||
|
||||
**Held, with reopen criteria** (evidence in `research/fifty_objects_r2_20260924/`):
|
||||
|
||||
| Item | Reopen when |
|
||||
|---|---|
|
||||
| Codex-reserved actor_combat + 5 dependents | Codex reports; then re-gate P1 dependents (vehicles fighter) |
|
||||
| Canary packet PA (collisions `_collision_move_point` +4,752, collisions complete) | Codex's real_math change lands; `rerun_packet.py --refresh` still 0 lost; owner rules on the duplicate-prototype copy choice (bdB vs ownership-natural bdI) and COMDAT admission |
|
||||
| ui_widget_game_data_input_functions solo (704 B) | Codex's record net N is known; consult `codex_lookup.txt` (N = +2/+3 closes it; +1/+4/+5 closes it with the PU/MN hygiene) |
|
||||
| hardware_geometry, bink `bink_decompress_audio_frame` | first-party evidence of the call site/argument, or an owner ruling on byte-inert unattested calls |
|
||||
| owner escalation table (above) | the listed rulings |
|
||||
| real_math.h January content (3 January-public helpers, 16 prototypes) | owner accepts losing the count-coincident canaries (fragility map), or their genuine repairs are found |
|
||||
|
||||
**Retired routes:**
|
||||
|
||||
- the record-count oracle as a primary route (1/126);
|
||||
- the Sept-map route for static DATA names (the atlas holds functions only);
|
||||
- the family-triage RETIRE list (`results/r2w1/TRIAGE__*`).
|
||||
|
||||
**Process incidents:** none this round. One review was interrupted by the integrator and re-run;
|
||||
its stale claim was released.
|
||||
|
||||
**Expected integration conflicts:** none known. The branch contains canonical 4d1ebf17
|
||||
exactly, plus b9930521 and the docs and research commits on top.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Fifty-object round-2 reconciliation (2026-09-24)
|
||||
|
||||
- Canonical before this reconciliation: `6e3465bc`; Claude tip: `69f30e19`.
|
||||
- Common ancestor: `4d1ebf17`. Its two completed Halo objects, three strict functions (4,128 meaningful code bytes), and 3,089 verified data bytes were already canonical. **Do not credit them again.**
|
||||
- Integrated the remaining map-backed private-function renames and `hs_compile` storage correction from `b9930521`, together with the research and handoff. These changes have zero new code, data, function, or object credit.
|
||||
- Resolved the two sound-cache conflicts by retaining canonical's four January-static declarations while adopting the map-backed `cache_block_get_sound_permutation_name` name. Park-key renames from the same batch remain measurement-stable.
|
||||
- Documented an attested original bug in `actors_spawn_from_unit`: when the swarm actor index is selected, January still passes the ordinary actor index to `actor_get`. The source comment replaces a blank line, preserving line numbering and exact code.
|
||||
|
||||
The `hardware_geometry` admission and the `bink_decompress_audio_frame` rename remain held: the proposed added calls have no first-party evidence for position and argument. Map-backed names alone do not authenticate the calls. No new whole-object admission was granted here. Existing static-storage gaps in `progress_bar` and `saved_game_files` remain open; the R2-3 naming changes do not close them.
|
||||
|
||||
Verification on the integrated tree: full `ninja` passes; the rename-stable whole-board sweep has 0 gained and 0 regressed functions against `6e3465bc`; Halo code remains 1,577,237 / 1,770,166 meaningful exact bytes and 7,445 / 7,574 functions; Halo data remains 2,587,011 / 3,923,451; whole Halo objects remain 383 / 468. Parks: 83 active, 0 stale, 0 invalid. Admission audit: 0 contradicted, 0 revoked. Fake-match scanner: the same 26 inherited review leads. Pytest: 1,161 passed, 5 skipped, 26 subtests.
|
||||
|
||||
Future work should use the detailed evidence and reopen criteria in `claude_fifty_objects_r2_20260924.md` and `research/fifty_objects_r2_20260924/`. Do not count scratch candidates or scorer-only changes as exact credit.
|
||||
@@ -0,0 +1,2 @@
|
||||
# evidence copies are kept byte-for-byte (patches must still apply) and are not style-checked
|
||||
* -text -whitespace
|
||||
@@ -0,0 +1 @@
|
||||
Files over 409600 bytes left in scratch (not copied):
|
||||
@@ -0,0 +1,228 @@
|
||||
# Worker brief - Halo January 50-object campaign, round 2 (lane claude/fifty-objects-r2-20260924)
|
||||
|
||||
Worktree (shared by all workers): `C:\halo-worktrees\claude-fifty-objects-r2-20260924`
|
||||
Base: canonical jonas/exact-pilots `f6d00a8c` (which already contains the whole round-1 lane).
|
||||
Scorer frozen: objdiff **3.3.1** sha1 3130e428 (never replace it; configure.py pins 3.6.0).
|
||||
Baseline: 381/468 Halo objects, 7,614/8,252 strict functions, code 1,573,109, data 2,583,826.
|
||||
|
||||
## 0. Hard rules for workers (violations corrupt everyone's work)
|
||||
|
||||
- **Never edit any tracked file** (source/, config/, tools/, docs/, headers, symbols.json,
|
||||
parked.json, config.json). Never run `ninja`, `configure.py`, `git add/commit/checkout/reset/stash`.
|
||||
The integrator applies every change. You work ONLY under `scratch/w/<your-unit-slug>/`.
|
||||
- Compile candidates with `python tools/campaign/gate.py source/<unit> --source scratch/w/<slug>/cand.c --all --out scratch/w/<slug>/cand.obj`
|
||||
(PID-isolated; safe in parallel). `--source` may be anywhere; the unit's directory is on /I.
|
||||
- The January target object is `build/split/<unit>.obj`; the current production build is
|
||||
`build/base/<unit>.obj`. Treat both as read-only.
|
||||
- Analyze leaked/first-party executables as DATA only. Never execute them.
|
||||
- Append findings to `scratch/w/<slug>/LEDGER.md` AS YOU GO (a cut-off run keeps nothing else).
|
||||
|
||||
## 1. What counts
|
||||
|
||||
Strict exact = `coff_compare.section_infos_equal` (size, normalized bytes, relocation count,
|
||||
type, address, target, addend). gate.py prints `EXACT` rows. Fuzzy %, instruction counts or a
|
||||
coincidental SHA are not exactness. An object is COMPLETE only when every January-owned function
|
||||
AND data/BSS section, every symbol (name, storage class, section, offset), and all surplus
|
||||
emissions (COMDAT helpers, literals, SDK tables) are admissible - see section 4.
|
||||
|
||||
Never count: scorer-version effects, status edits, already-identical bytes, fuzzy gains.
|
||||
|
||||
## 2. House rules (all changed source) - docs/campaign_house_rules.md is authoritative
|
||||
|
||||
void on its own line for empty params; one parameter per line; explicit `return;` / valid
|
||||
return values; typed tag/object access macros; prototypes in genuine owner headers (never a
|
||||
consumer-local prototype for another file's function); `real` not `float`; cseries.h macros
|
||||
(TEST_FLAG/SET_FLAG/FLAG/PIN/MIN/MAX/NUMBEROF...) over hand bit twiddling; correct enum constants
|
||||
(also in switch tables); combine declaration+initialisation where natural; authentic or
|
||||
descriptive names (never code_/bss_+address); assertions via the lazy project macros
|
||||
(match_assert/match_vassert/... with the right predicate sense; see docs/assertions.md).
|
||||
|
||||
Rule 6: never hand-expand or hand-copy point_from_line3d or any header helper. A shared-header
|
||||
`__inline` may emit a COMDAT ONLY if the copy is byte-identical to January's selected provider,
|
||||
the caller is strictly exact, the full sweep has zero regressions and ordinary provider links
|
||||
pass in BOTH orders (scratch/tools/provider_link.py). No blanket COMDAT permission.
|
||||
|
||||
Rejected as fake matching (the STRIP TEST: remove the decoration; if the plain spelling no longer
|
||||
matches, the decoration IS the fake): decoration-only parentheses, redundant zero stores without
|
||||
independent evidence, filler declarations/dummy locals (they are the name-count ORACLE, never a
|
||||
landing), do{}while(FALSE) or one-trip loops to buy inline budget, volatile/aliasing tricks,
|
||||
pragmas, forced inline, inline asm as a general lever, invented UB. A new 3D-to-2D (or other
|
||||
representation) view cast needs per-site first-party /Od attestation, compatible prefix layout,
|
||||
a byte-inert strip test, a strictly exact caller and ledger disclosure. Reproducing an authentic
|
||||
January bug needs target+layout proof, a BUG comment and owner approval - report, don't land.
|
||||
|
||||
Compiler flags: `/QIfist` only where a unit already requires it (config); never add per-unit
|
||||
flags to buy a match. Inline asm only sparingly, in evidenced low-level helper/math code.
|
||||
Also avoid: fake dependencies, unjustified casts, dead locals, duplicate branches, compiler
|
||||
directives, UB, nonsensical logic. Park credible fuzzy source at zero exact credit.
|
||||
|
||||
Held items you must NOT retry: path_obstacles bare-parenthesis match, actor_aim_grenade invented
|
||||
goto, hud_draw optimizer pragma, s3tc live out-of-bounds behaviour, render_sprite memory
|
||||
corruption, flags `x * height` with x just set to zero, any incompatible helper provider.
|
||||
decals.c / physics.c are closed for this lane unless you hold NEW evidence for the specific
|
||||
load/slot/x87 residuals recorded in docs/object_matching_logs/claude_decals_physics_20260924.md.
|
||||
|
||||
## 3. Evidence sources and tools (use these before guessing)
|
||||
|
||||
- January bytes/relocs: `python tools/campaign/tinfo.py source/<unit> [--fn F] [--data]`,
|
||||
`python tools/campaign/alndiff.py source/<unit> <fn> --ours-object <obj>` (aligned diff; never
|
||||
trust gate.py --disas index pairing), `python tools/campaign/relocdiff.py source/<unit> <fn> [obj]`,
|
||||
`python tools/campaign/real_regions.py source/<unit> <fn> --ours-object <obj>`.
|
||||
- Lane helpers in scratch/tools/: `sbs.py` (side-by-side range), `dis_range.py`,
|
||||
`reloc_segments.py` (instruction census between relocation anchors), `slot_census.py` and
|
||||
`slot_refs.py` (frame slots), `leafswaps.py` (classify alndiff blocks LEAF/SLOT/REG/OTHER).
|
||||
- Later first-party **/Od+/RTC build** (statement order, real calls vs expressions, named locals as
|
||||
frame slots, RTC descriptors naming every address-taken aggregate, assert LINE numbers):
|
||||
`python scratch/tools/odbuild.py str "<string>"`, `... callers 0xADDR`, `... fn 0xADDR --out f.txt`.
|
||||
odbuild misses aligned-frame prologues (`push ebx; mov ebx,esp; and esp,-8`): then use
|
||||
`python scratch/tools/od_linear.py 0xSTART 0xEND out.txt`. It is a LATER revision - evidence for
|
||||
names/types/shape only; every fact must be double-attested against January's own bytes.
|
||||
- **HCEX.pdb** (2011 PPC SHIP build; real names/types of params and stack locals, file statics):
|
||||
`"C:/Users/isabe/Documents/Codex/2026-07-13/i-w/research/tools/DIA2Dump/x64/Release/DIA2Dump.exe" -sym <function> "C:/Users/isabe/Documents/Codex/2026-07-13/i-w/research/hcea_jun2011_prototype/payload/Halo CE Anniversary (Jun 24 2011)/HCEX.pdb"`
|
||||
(enregistered scalars are absent; layouts/offsets do not transfer).
|
||||
- cachebeta.pdb publics (January storage truth: public = external, absent = file-static):
|
||||
`scratch/tools/cachebeta_publics.txt`, checked by `python scratch/tools/pdb_storage.py source/<unit>`.
|
||||
- Halo CE symbol atlas / Marathon source / Bungie fragments: names and idioms, not byte proof.
|
||||
- Ghidra 12.1.2 headless: `C:/Users/isabe/Documents/Codex/halo-tools/apps/ghidra_12.1.2_PUBLIC`
|
||||
(support/analyzeHeadless.bat); IDA Free 9.4 is GUI-only. Record exactly what a tool established;
|
||||
a decompiler rendering is not original source.
|
||||
- Existing ledgers: `docs/object_matching_logs/*<unit>*`, parks in `config/parked.json`
|
||||
(`python -B -m tools.parked_functions`), rejections in `config/object_admission_rejections.json`.
|
||||
READ THE NEGATIVE EXPERIMENTS before probing; do not repeat recorded inert spellings.
|
||||
|
||||
## 4. Whole-object admission audit (for any object you claim complete)
|
||||
|
||||
1. `python tools/campaign/gate.py source/<unit> --source <cand> --all --out <obj>`: every row EXACT.
|
||||
2. `python scratch/tools/object_audit.py source/<unit> <obj>`: every January-owned section and
|
||||
symbol (storage, section, offset) matches; lists candidate-only surplus.
|
||||
3. `python scratch/tools/pdb_storage.py source/<unit>` (on the production build; for a candidate
|
||||
reason from its symbols): storage vs cachebeta publics.
|
||||
4. Surplus: `python scratch/tools/surplus_identity.py source/<unit>` and
|
||||
`python scratch/tools/provider_link.py source/<unit> <obj>` - every surplus COMDAT must be
|
||||
byte-identical to January's selected copy and pair-link (no LNK2005/LNK1169) in both orders.
|
||||
Known conflicts: NODUP hand copies (`python scratch/tools/nodup_census.py _sym ...`).
|
||||
5. Data: `python tools/campaign/tinfo.py source/<unit> --data` vs `--base`; objdiff 3.3.1 has a
|
||||
known '$'-literal relocation-name defect - a data section that is byte+relocation identical
|
||||
under coff_compare but <100% in build/report.json is a scorer defect, handled by a pinned
|
||||
config/semantic_data_matches.json entry (integrator applies; single-section entries only).
|
||||
6. Check config/object_admission_rejections.json and parks for the unit.
|
||||
|
||||
## 5. Decoded compiler laws (use as hypothesis generators; each has a ledger)
|
||||
|
||||
- Frame-size mismatch (`sub esp,N`, see scratch/baseline/frame_census.txt) is STRUCTURAL: a
|
||||
different set/scope/type of homed locals, never a tie. Slot sharing is gated by declaration
|
||||
SCOPE (an object may merge into another's slot only if neither scope encloses the other);
|
||||
address-taken locals conflict until the end of their declaration scope. Below 0x80 total the
|
||||
frame order is size-ascending + per-reference bubble-up; above 0x80 a quicksort on
|
||||
(1000*refs)/size. A partly homed aggregate costs its whole extent.
|
||||
- Single-exit law: January usually returns ONCE at the bottom (result/valid flag), not early
|
||||
returns; count return statements. Fixing it on a static cascades to callers (private ABI).
|
||||
- /Od readout first: named locals (count user-area frame slots, not only RTC aggregates), statement
|
||||
order, which helpers are real calls, loop-counter scoping, argument order of helper calls.
|
||||
- Inline gating: per call SITE, callee cost vs block-weight budget; each extra if/&&/|| level on
|
||||
the path lowers the budget; an early return costs one step for the rest of the function; a
|
||||
`= {0}` aggregate initialiser and a match_assert in the helper raise cost. Measure the boundary
|
||||
with lab copies of the call placed along the path (lab only).
|
||||
- M8: x87 operand order of inlined helpers follows IL-local ordinals mod 8 of their parameters;
|
||||
helper ARGUMENT order matters, bare source operand order of `a*b` is inert.
|
||||
- Store/call order: a store through a pointer cannot cross a call, so its position relative to a
|
||||
call IS January's statement order. Post-increment inside a call argument vs a separate
|
||||
statement changes whether the increment precedes the call.
|
||||
- LAW Z: "January pins a zero register and we don't" is a SOURCE defect (a surplus long-lived
|
||||
value/alias, declaration order of zero-initialised locals), not a tie.
|
||||
- Accessor binding: `&accessor(...)->field` inline folds destructively; binding to a local gives
|
||||
the non-destructive lea - read the bytes per site.
|
||||
- VC7 unrolls small constant-trip for/while but not do..while; NUMBEROF is size_t (unsigned
|
||||
compare); `and 80000007h` proves a signed divisor; a float literal 1 ULP off proves a folded
|
||||
expression.
|
||||
- Warnings as detectors: `CL /Zs /W3` C4013 implicit declarations push real args as doubles.
|
||||
- Name-count / declaration-count ties: dummy declarations flip distant ties - use ONLY as an
|
||||
oracle to locate genuinely missing January declarations; never land fillers.
|
||||
- Methodology stop rule: after ~5 evidence-based source shapes with only an interchangeable
|
||||
register / dependency-free order left, stop, preserve the best credible candidate at zero
|
||||
credit, record reopen criteria.
|
||||
|
||||
## 6. Reporting
|
||||
|
||||
Your final answer must be the structured result requested by the orchestrator. Keep full
|
||||
evidence in `scratch/w/<slug>/` (candidate .c, gate rows before/after, alndiff excerpts,
|
||||
LEDGER.md with every probe: hypothesis -> evidence -> change -> measured result).
|
||||
|
||||
## 7. Claims, manifests and incident rules (round 2)
|
||||
|
||||
**Claim registry (mandatory).** Before you edit candidate source for ANY unit (your assigned unit,
|
||||
or a provider/header consumer you discover), claim it:
|
||||
|
||||
python scratch/campaign/claim.py claim source/<unit> <your-label> "<what you will try>"
|
||||
|
||||
Exit code 3 means another agent holds it or it is RESERVED: do not probe it for landing (reading
|
||||
is fine); report the dependency instead. Release when you finish:
|
||||
|
||||
python scratch/campaign/claim.py release source/<unit> <your-label> "<outcome>"
|
||||
|
||||
`python scratch/campaign/claim.py show` lists all claims. RESERVED for the external Codex packet
|
||||
(do NOT duplicate until it reports): source/ai/actor_combat and its five dependents
|
||||
path_obstacle_avoidance, path_smoothing, math/real_math, physics/collision_features,
|
||||
ai/path_structure_bsp (the actor_combat cross_product2d provider repair).
|
||||
|
||||
**Per-object manifest.** For every object you touch, write `scratch/w/<slug>/MANIFEST.md`:
|
||||
base/tip commit; source evidence (per changed construct: January bytes, /Od, HCEX, PDB, atlas);
|
||||
target vs candidate per function (padded size, normalized sha, relocation count; gate row);
|
||||
data sections (coff_compare), symbol storage/owner (object_audit, pdb_storage), surplus helpers
|
||||
(surplus_identity) and provider links in both orders; house-rule review; tests you ran; what is
|
||||
credited (meaningful and padded code, data, admission) vs zero-credit; held items with reopen
|
||||
criteria.
|
||||
|
||||
**Incident rules (two real incidents in round 1).** A reviewer's broken `&&` chain ran
|
||||
`rm -rf .git` in the worktree root, and a repo script run with `--help` rewrote a tracked source
|
||||
file. Therefore: never run rm/mv/cp/sed -i/redirects whose target is not under YOUR
|
||||
scratch/w/<slug>/; never touch .git, build/, config/, source/, tools/, docs/ (read only); READ a
|
||||
repo script's source before running it (do not assume --help is safe); if `git status` shows a
|
||||
tracked modification you did not expect, STOP and report it.
|
||||
|
||||
## 8. Held classes and retired routes (do not spend effort here without NEW evidence)
|
||||
|
||||
- Canonical holds (reasons still apply): rasterizer_xbox_dynavobgeom (stock SDK-table coalescing
|
||||
vs canonical ruling + consumer-local `global_window_parameters`), and every January-bug
|
||||
candidate (uninitialised reads, NULL dereference, overruns, file left open): king, glow,
|
||||
dead_camera, first_person_weapons B, player_profile R1-R3, saved_game_files, main_crash,
|
||||
motion_sensor_update, hud_weapon crosshairs/update, rasterizer_lights reset, hs_parse_boolean,
|
||||
effect_allowed_by_environment, ai_test_line_of_sight, compare_profile_sections.
|
||||
- The round-1 owner queue (docs/object_matching_logs/claude_fifty_objects_20260925_owner_queue.md)
|
||||
is EVIDENCE, not approval. Its items (descriptive-name splits for rasterizer_xbox /
|
||||
hs_scenario_definitions / render_debug D1, hardware_geometry A/B, object_lights __FILE__ surplus,
|
||||
game_engine alias-vs-view pick) stay owner-gated unless you find FIRST-PARTY evidence that
|
||||
removes the need for the ruling (e.g. an authentic name, an authentic call site).
|
||||
- New header COMDAT from a non-exact caller (the "P1 class") is not landable.
|
||||
- Declared-name-count compensation: dummy declarations are an ORACLE only. A board census found
|
||||
the oracle closes very few ties (2 of 57 rows); do not run it as a primary route.
|
||||
- Retirement rule: if a unit's recorded negatives already cover the shape family you would try,
|
||||
or ~5 of your own evidence-backed shapes leave only an interchangeable register/order, STOP,
|
||||
record it and report RETIRE. Do not re-probe a tie that round 1 (research/fifty_objects_20260925/
|
||||
results/) or earlier lanes exhausted.
|
||||
|
||||
## 9. Laws decoded in round 1 (hypothesis generators)
|
||||
|
||||
- VC7 compiles functions in definition order, deferring any function that calls a not-yet-defined
|
||||
TU function to the end: emission order recovers January's definition order.
|
||||
- Allocator block weight = number of webs referenced in the block: an inlined helper's named
|
||||
local can flip caller colouring.
|
||||
- A load from a FILE-STATIC const aggregate whose address is never taken is hoisted above
|
||||
pointer stores (an external one is not): check cachebeta publics for const globals.
|
||||
- Reviewers reject block groupings that contradict the /Od frame's DECLARATION order even when
|
||||
exact; only a local whose address reaches an out-of-line call needs its own scope (escape law).
|
||||
- /Od RTC names + the same statement pair + zero assert-anchor drift can authenticate a dead
|
||||
statement pair; a dead statement WITHOUT /Od attestation is a filler.
|
||||
- Admission blockers even when every byte matches: caller-local struct views with opaque spans,
|
||||
consumer-local prototypes of other files' functions, hand-expanded header helpers, float for
|
||||
real, invented names/aggregates, pad members in a TU-private struct (VC7 /O2 pads every
|
||||
file-scope static to 4 bytes, so pad members signal an invented aggregate).
|
||||
- An unreferenced non-public STATIC function is still emitted if the source USES it (inlined at
|
||||
every site): storage cannot be inferred from "unreferenced".
|
||||
- Canonical accepted file-scope `= { 0 }` statics to fix .bss order (models, a595bbc2) and the
|
||||
Layer 2 / P7 declaration-count effects with disclosure; hud_draw.h now owns check_stack_buffer
|
||||
and the match_assert_stack_frame sentinel macro.
|
||||
- Tooling: board.py (scratch/campaign/board.json/.md) is the live opportunity board;
|
||||
tools/campaign/{frame_census,structural_split,data_census}.py outputs are in scratch/baseline/.
|
||||
S1 = relocation multiset differs (missing/extra reference; strongest structural signal),
|
||||
S2 = instruction count differs, T = tie-shaped.
|
||||
@@ -0,0 +1,71 @@
|
||||
"""Integrator admission helper: flip config.json statuses, append semantic data entries, drop rejections.
|
||||
|
||||
python scratch/campaign/admit.py --match source/x/y.c [...] [--unmatch source/..c]
|
||||
[--data-entry entry.json ...] [--drop-rejection <unit> <symbol-prefix>] ...
|
||||
All edits are textual and in place (no JSON re-serialisation of config.json / rejections).
|
||||
"""
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
|
||||
args = sys.argv[1:]
|
||||
match, unmatch, entries, drops = [], [], [], []
|
||||
i = 0
|
||||
while i < len(args):
|
||||
a = args[i]
|
||||
if a == '--match':
|
||||
match.append(args[i + 1]); i += 2
|
||||
elif a == '--unmatch':
|
||||
unmatch.append(args[i + 1]); i += 2
|
||||
elif a == '--data-entry':
|
||||
entries.append(args[i + 1]); i += 2
|
||||
elif a == '--drop-rejection':
|
||||
drops.append((args[i + 1], args[i + 2])); i += 3
|
||||
else:
|
||||
sys.exit('bad arg ' + a)
|
||||
|
||||
|
||||
def edit_status(names, new):
|
||||
p = 'config/config.json'
|
||||
raw = open(p, 'rb').read().decode('utf-8')
|
||||
for n in names:
|
||||
pat = re.compile(r'(\{ "name": "%s", "index": \d+, "status": ")(\w+)(" \})' % re.escape(n))
|
||||
hits = pat.findall(raw)
|
||||
if len(hits) != 1:
|
||||
sys.exit('status: %d hits for %s' % (len(hits), n))
|
||||
raw = pat.sub(lambda m: m.group(1) + new + m.group(3), raw)
|
||||
print('status', n, hits[0][1], '->', new)
|
||||
open(p, 'wb').write(raw.encode('utf-8'))
|
||||
|
||||
|
||||
if match:
|
||||
edit_status(match, 'Matching')
|
||||
if unmatch:
|
||||
edit_status(unmatch, 'NonMatching')
|
||||
|
||||
if entries:
|
||||
p = 'config/semantic_data_matches.json'
|
||||
raw = open(p, 'rb').read().decode('utf-8')
|
||||
nl = '\r\n' if '\r\n' in raw else '\n'
|
||||
body = raw.rstrip()
|
||||
assert body.endswith(']'), 'unexpected end'
|
||||
body = body[:-1].rstrip()
|
||||
for e in entries:
|
||||
obj = json.load(open(e))
|
||||
txt = json.dumps(obj, indent=2).replace('\n', nl)
|
||||
txt = nl.join(' ' + l for l in txt.split(nl))
|
||||
body += ',' + nl + txt
|
||||
print('data entry', obj['unit'], obj.get('symbol'))
|
||||
open(p, 'wb').write((body + nl + ']' + nl).encode('utf-8'))
|
||||
json.load(open(p))
|
||||
|
||||
if drops:
|
||||
p = 'config/object_admission_rejections.json'
|
||||
d = json.load(open(p))
|
||||
before = len(d['entries'])
|
||||
for unit, sym in drops:
|
||||
d['entries'] = [e for e in d['entries'] if not (e['unit'] == unit and e['symbol'].startswith(sym))]
|
||||
print('rejections', before, '->', len(d['entries']))
|
||||
raw = open(p, 'rb').read().decode('utf-8')
|
||||
nl = '\r\n' if '\r\n' in raw else '\n'
|
||||
open(p, 'wb').write((json.dumps(d, indent=2, ensure_ascii=False).replace('\n', nl) + nl).encode('utf-8'))
|
||||
@@ -0,0 +1,35 @@
|
||||
"""Run the whole-object admission battery on production build/base for a list of units.
|
||||
|
||||
python scratch/campaign/audit_battery.py <unit> [<unit> ...] (units like ai/path)
|
||||
Prints per unit: gate totals, object_audit verdict (+ failing lines), PDB disagreements,
|
||||
surplus identity, provider-link verdict (+ failing symbols), report data %.
|
||||
"""
|
||||
import json
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
rep = {u['name']: u for u in json.load(open('build/report.json'))['units']}
|
||||
|
||||
|
||||
def run(cmd):
|
||||
r = subprocess.run(cmd, capture_output=True, text=True)
|
||||
return (r.stdout + r.stderr).strip().splitlines()
|
||||
|
||||
|
||||
for u in sys.argv[1:]:
|
||||
unit = 'source/' + u
|
||||
g = run([sys.executable, 'tools/campaign/gate.py', unit, '--all'])
|
||||
oa = run([sys.executable, 'scratch/tools/object_audit.py', unit])
|
||||
pdb = run([sys.executable, 'scratch/tools/pdb_storage.py', unit])
|
||||
si = run([sys.executable, 'scratch/tools/surplus_identity.py', unit])
|
||||
pl = run([sys.executable, 'scratch/tools/provider_link.py', unit])
|
||||
m = rep.get(unit, {}).get('measures', {})
|
||||
print('=' * 20, u)
|
||||
print(' gate :', g[-1] if g else '?')
|
||||
bad = [l for l in oa if 'DIFF' in l or 'MISSING' in l or 'storage' in l.lower() and '!=' in l]
|
||||
print(' audit :', oa[-1] if oa else '?', '|', ' ; '.join(x.strip() for x in bad[:6]))
|
||||
print(' pdb :', pdb[-1] if pdb else '?')
|
||||
print(' surplus:', si[-1] if si else '?', '|', ' ; '.join(x.strip() for x in si if 'DIFFERENT' in x)[:300])
|
||||
fails = [l.split()[0] for l in pl if l.rstrip().endswith('FAIL') or 'NO JANUARY PROVIDER' in l]
|
||||
print(' link :', pl[-1] if pl else '?', fails)
|
||||
print(' data : %s/%s' % (m.get('matched_data'), m.get('total_data')))
|
||||
@@ -0,0 +1,93 @@
|
||||
"""Integrator batch gate: run the full verification chain and summarise against the frozen baseline.
|
||||
|
||||
python scratch/campaign/batch_gate.py <label>
|
||||
|
||||
Steps: guard objdiff version (3.3.1) and CL path, ninja (full; re-patch build.ninja if configure
|
||||
re-ran), parse progress, stable_verdicts snapshot+diff vs scratch/baseline/stable.json, parks,
|
||||
admission audit, fake-match scan (lead count vs baseline), pytest, git diff --check.
|
||||
Writes scratch/campaign/gate_<label>/ with every raw log.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
os.chdir(ROOT)
|
||||
label = sys.argv[1]
|
||||
out = os.path.join('scratch', 'campaign', 'gate_' + label)
|
||||
os.makedirs(out, exist_ok=True)
|
||||
|
||||
|
||||
def run(name, cmd, timeout=3600):
|
||||
r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout, shell=isinstance(cmd, str))
|
||||
open(os.path.join(out, name + '.log'), 'w', encoding='utf-8').write(r.stdout + '\n' + r.stderr)
|
||||
return r
|
||||
|
||||
|
||||
def objdiff_version():
|
||||
return run('objdiff_version', [os.path.join('build', 'tools', 'objdiff-cli.exe'), '--version']).stdout.strip()
|
||||
|
||||
|
||||
summary = {}
|
||||
v = objdiff_version()
|
||||
summary['objdiff'] = v
|
||||
if '3.3.1' not in v:
|
||||
print('ABORT: objdiff is not 3.3.1:', v)
|
||||
sys.exit(2)
|
||||
|
||||
# ninja; if configure re-ran, re-patch the CL path and rebuild
|
||||
r = run('ninja', ['ninja'])
|
||||
if r.returncode != 0 and 'The system cannot find the file specified' in (r.stdout + r.stderr):
|
||||
run('ninja_manifest', ['ninja', 'build.ninja'])
|
||||
run('patch', [sys.executable, 'scratch/patch_ninja.py'])
|
||||
r = run('ninja', ['ninja'])
|
||||
bn = open('build.ninja').read()
|
||||
if 'command = xbox/bin/vc7/CL.Exe' in bn:
|
||||
run('patch', [sys.executable, 'scratch/patch_ninja.py'])
|
||||
r = run('ninja', ['ninja'])
|
||||
summary['ninja_exit'] = r.returncode
|
||||
v2 = objdiff_version()
|
||||
summary['objdiff_after'] = v2
|
||||
log = r.stdout
|
||||
m = re.search(r'halobetacache: ([\d.]+)% matched, ([\d.]+)% linked \((\d+) / (\d+) files\)\s+Code: (\d+) / (\d+) bytes \((\d+) / (\d+) functions\)\s+Data: (\d+) / (\d+) bytes', log)
|
||||
if m:
|
||||
summary['halo'] = {'objects': int(m.group(3)), 'of': int(m.group(4)), 'code': int(m.group(5)),
|
||||
'code_total': int(m.group(6)), 'functions': int(m.group(7)), 'data': int(m.group(9))}
|
||||
m = re.search(r'All: [\d.]+% matched, [\d.]+% linked \((\d+) / (\d+) files\)', log)
|
||||
if m:
|
||||
summary['all_objects'] = int(m.group(1))
|
||||
|
||||
run('snapshot', [sys.executable, '-m', 'tools.campaign.stable_verdicts', 'snapshot', os.path.join(out, 'stable.json')])
|
||||
d = run('stable_diff', [sys.executable, '-m', 'tools.campaign.stable_verdicts', 'diff', 'scratch/baseline/stable.json', os.path.join(out, 'stable.json')])
|
||||
summary['stable_diff_exit'] = d.returncode
|
||||
summary['stable_diff_tail'] = d.stdout.strip().splitlines()[-6:]
|
||||
|
||||
p = run('parks', [sys.executable, '-B', '-m', 'tools.parked_functions'])
|
||||
try:
|
||||
summary['parks'] = json.loads(p.stdout)['summary']
|
||||
except Exception:
|
||||
summary['parks'] = p.stdout[-400:]
|
||||
a = run('admission', [sys.executable, 'tools/audit_object_admission.py'])
|
||||
try:
|
||||
aj = json.loads(a.stdout)
|
||||
summary['admission'] = aj['summary']
|
||||
summary['admission_contradicted'] = [c.get('unit') for c in aj.get('contradicted', [])]
|
||||
summary['admission_revoked'] = [c.get('unit') for c in aj.get('revoked', [])]
|
||||
except Exception:
|
||||
summary['admission'] = a.stdout[-400:]
|
||||
f = run('fake_scan', [sys.executable, 'tools/fake_match_scan.py'])
|
||||
m = re.search(r'(\d+) review lead', f.stdout)
|
||||
summary['fake_leads'] = int(m.group(1)) if m else f.stdout[-200:]
|
||||
t = run('pytest', [sys.executable, '-m', 'pytest', '-q', 'tools', '--basetemp=' + os.path.join(ROOT, 'scratch', 'pytest_tmp')])
|
||||
summary['pytest'] = t.stdout.strip().splitlines()[-1] if t.stdout.strip() else t.stderr[-200:]
|
||||
g = run('diff_check', ['git', 'diff', '--check', '--', 'config', 'source', 'docs', 'tools'])
|
||||
summary['diff_check'] = 'clean' if not g.stdout.strip() else g.stdout[:400]
|
||||
import shutil
|
||||
for rep in ('report.json', 'semantic_report.json'):
|
||||
if os.path.exists(os.path.join('build', rep)):
|
||||
shutil.copyfile(os.path.join('build', rep), os.path.join(out, rep))
|
||||
summary['head'] = run('head', ['git', 'rev-parse', '--short', 'HEAD']).stdout.strip()
|
||||
json.dump(summary, open(os.path.join(out, 'summary.json'), 'w'), indent=1)
|
||||
print(json.dumps(summary, indent=1))
|
||||
@@ -0,0 +1,118 @@
|
||||
"""Live opportunity board of unfinished Halo objects (read-only; parallel audit battery).
|
||||
|
||||
python scratch/campaign/board.py [--stable scratch/baseline/stable.json] [--jobs 12] [--no-audit]
|
||||
|
||||
Writes scratch/campaign/board.json and board.md. Per incomplete Halo unit:
|
||||
strict functions (stable snapshot), missing functions with park class, objdiff data gap,
|
||||
admission rejections, object_audit verdict, PDB storage disagreements, surplus identity,
|
||||
selected-provider link, prior-ledger count, claim/reservation, and a priority tier:
|
||||
T1 = every function exact (blocked only by ownership/linkage/names/data/layout)
|
||||
T2 = one or two residual functions, total gap <= 2,048 padded bytes
|
||||
T3 = other one/two-function objects
|
||||
T4 = three or more residual functions
|
||||
Ties inside a tier sort by gap bytes, then data gap. Fuzzy percentage is NOT used.
|
||||
"""
|
||||
import collections
|
||||
import concurrent.futures as cf
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
os.chdir(ROOT)
|
||||
args = sys.argv[1:]
|
||||
stable_path = args[args.index('--stable') + 1] if '--stable' in args else 'scratch/baseline/stable.json'
|
||||
jobs = int(args[args.index('--jobs') + 1]) if '--jobs' in args else 12
|
||||
audit = '--no-audit' not in args
|
||||
|
||||
cfg = json.load(open('config/config.json'))
|
||||
halo = [p for p in cfg['projects'] if p['name'] == 'halobetacache'][0]
|
||||
status = {o['name'].rsplit('.', 1)[0]: o.get('status', '') for o in halo['objects']}
|
||||
stable = json.load(open(stable_path))
|
||||
per = collections.defaultdict(lambda: {'fn': 0, 'exact': 0, 'bytes': 0, 'exact_bytes': 0, 'missing': []})
|
||||
for key, v in stable.items():
|
||||
unit = key.split('::')[0]
|
||||
d = per[unit]
|
||||
d['fn'] += 1
|
||||
d['bytes'] += v.get('size', 0)
|
||||
if v.get('status') == 'E':
|
||||
d['exact'] += 1
|
||||
d['exact_bytes'] += v.get('size', 0)
|
||||
else:
|
||||
d['missing'].append([v.get('name'), v.get('size'), v.get('status')])
|
||||
rep = {u['name']: u for u in json.load(open('build/report.json'))['units']}
|
||||
parks = json.load(open('config/parked.json'))['entries']
|
||||
park = {(p['unit'], p['function']): p.get('class') for p in parks}
|
||||
rej = collections.defaultdict(list)
|
||||
for r in json.load(open('config/object_admission_rejections.json'))['entries']:
|
||||
rej[r['unit']].append('%s:%s' % (r['class'], r['symbol'][:40]))
|
||||
claims = {}
|
||||
if os.path.exists('scratch/campaign/claims.json'):
|
||||
claims = json.load(open('scratch/campaign/claims.json'))
|
||||
logs = os.listdir('docs/object_matching_logs')
|
||||
|
||||
|
||||
def ledger_count(unit):
|
||||
base = unit.rsplit('/', 1)[1]
|
||||
return sum(1 for f in logs if f.startswith(base + '_') or f.startswith(base + '.'))
|
||||
|
||||
|
||||
def run(cmd):
|
||||
r = subprocess.run(cmd, capture_output=True, text=True)
|
||||
return (r.stdout + r.stderr).strip().splitlines()
|
||||
|
||||
|
||||
def battery(unit):
|
||||
out = {}
|
||||
oa = run([sys.executable, 'scratch/tools/object_audit.py', unit])
|
||||
out['audit'] = oa[-1] if oa else '?'
|
||||
out['audit_fail_lines'] = [l.strip() for l in oa if ('DIFF' in l or 'MISSING' in l or '!=' in l)][:8]
|
||||
pdb = run([sys.executable, 'scratch/tools/pdb_storage.py', unit])
|
||||
out['pdb'] = pdb[-1] if pdb else '?'
|
||||
si = run([sys.executable, 'scratch/tools/surplus_identity.py', unit])
|
||||
out['surplus'] = si[-1] if si else '?'
|
||||
out['surplus_different'] = [l.strip() for l in si if 'DIFFERENT' in l][:6]
|
||||
pl = run([sys.executable, 'scratch/tools/provider_link.py', unit])
|
||||
out['link'] = pl[-1] if pl else '?'
|
||||
out['link_fail'] = [l.split()[0] for l in pl if l.rstrip().endswith('FAIL') or 'NO JANUARY PROVIDER' in l][:10]
|
||||
return out
|
||||
|
||||
|
||||
rows = []
|
||||
for unit, st in status.items():
|
||||
if not unit.startswith('source/') or st == 'Matching' or unit == 'source/linker_common':
|
||||
continue
|
||||
d = per.get(unit, {'fn': 0, 'exact': 0, 'bytes': 0, 'exact_bytes': 0, 'missing': []})
|
||||
m = rep.get(unit, {}).get('measures', {})
|
||||
total_data = int(m.get('total_data', 0) or 0)
|
||||
matched_data = int(m.get('matched_data', 0) or 0)
|
||||
missing = sorted(d['missing'], key=lambda x: x[1] or 0)
|
||||
for x in missing:
|
||||
x.append(park.get((unit, x[0]), '-'))
|
||||
gap_fn = d['fn'] - d['exact']
|
||||
gap_b = d['bytes'] - d['exact_bytes']
|
||||
tier = 'T1' if gap_fn == 0 else ('T2' if gap_fn <= 2 and gap_b <= 2048 else ('T3' if gap_fn <= 2 else 'T4'))
|
||||
c = claims.get(unit)
|
||||
rows.append({'unit': unit, 'tier': tier, 'fn': d['fn'], 'exact': d['exact'], 'gap_fn': gap_fn,
|
||||
'gap_bytes': gap_b, 'data_total': total_data, 'data_gap': total_data - matched_data,
|
||||
'rejections': rej.get(unit, []), 'missing': missing, 'ledgers': ledger_count(unit),
|
||||
'claim': (c['state'] + ':' + c['agent']) if c and c['state'] in ('claimed', 'reserved') else ''})
|
||||
if audit:
|
||||
with cf.ThreadPoolExecutor(jobs) as ex:
|
||||
res = dict(zip([r['unit'] for r in rows], ex.map(battery, [r['unit'] for r in rows])))
|
||||
for r in rows:
|
||||
r.update(res[r['unit']])
|
||||
rows.sort(key=lambda r: (r['tier'], r['gap_bytes'], r['data_gap']))
|
||||
json.dump(rows, open('scratch/campaign/board.json', 'w'), indent=1)
|
||||
with open('scratch/campaign/board.md', 'w', encoding='utf-8') as fh:
|
||||
fh.write('| tier | unit | fns | gapB | dataGap | missing (size, park) | rejections | audit | pdb | link fails | ledgers | claim |\n')
|
||||
fh.write('|---|---|---|---|---|---|---|---|---|---|---|---|\n')
|
||||
for r in rows:
|
||||
miss = '; '.join('%s %s %s' % (x[0], x[1], x[3]) for x in r['missing'][:4])
|
||||
fh.write('| %s | %s | %d/%d | %d | %d | %s | %s | %s | %s | %s | %d | %s |\n' % (
|
||||
r['tier'], r['unit'][7:], r['exact'], r['fn'], r['gap_bytes'], r['data_gap'], miss,
|
||||
', '.join(r['rejections']), r.get('audit', '')[:30], r.get('pdb', '')[:30],
|
||||
' '.join(r.get('link_fail', [])), r['ledgers'], r['claim']))
|
||||
print('incomplete Halo objects:', len(rows), collections.Counter(r['tier'] for r in rows))
|
||||
@@ -0,0 +1,105 @@
|
||||
"""Agent claim registry for the r2 fifty-object lane (atomic; safe for concurrent agents).
|
||||
|
||||
python scratch/campaign/claim.py claim <unit> <agent> "<reason>" -> exit 0 if claimed, 3 if held by another
|
||||
python scratch/campaign/claim.py release <unit> <agent> "<outcome>"
|
||||
python scratch/campaign/claim.py show [<unit>]
|
||||
python scratch/campaign/claim.py reserve <unit> <owner> "<reason>" (integrator only: permanent external hold)
|
||||
|
||||
<unit> is a source unit without extension, e.g. source/ai/actor_combat.
|
||||
Claims live in scratch/campaign/claims.json, guarded by an O_EXCL lock file. A unit
|
||||
claimed by another agent (or reserved) must not be edited or probed for landing by you;
|
||||
read-only study is fine. Every claim/release is appended to claims.log.
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||||
REG = os.path.join(HERE, 'claims.json')
|
||||
LOG = os.path.join(HERE, 'claims.log')
|
||||
LOCK = REG + '.lock'
|
||||
|
||||
|
||||
def locked(fn):
|
||||
for _ in range(600):
|
||||
try:
|
||||
fd = os.open(LOCK, os.O_CREAT | os.O_EXCL | os.O_WRONLY)
|
||||
break
|
||||
except FileExistsError:
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
sys.exit('claim registry lock timeout: ' + LOCK)
|
||||
try:
|
||||
data = json.load(open(REG, encoding='utf-8')) if os.path.exists(REG) else {}
|
||||
rc = fn(data)
|
||||
tmp = REG + '.tmp'
|
||||
json.dump(data, open(tmp, 'w', encoding='utf-8'), indent=1, sort_keys=True)
|
||||
os.replace(tmp, REG)
|
||||
return rc
|
||||
finally:
|
||||
os.close(fd)
|
||||
os.remove(LOCK)
|
||||
|
||||
|
||||
def log(line):
|
||||
with open(LOG, 'a', encoding='utf-8') as fh:
|
||||
fh.write(time.strftime('%Y-%m-%d %H:%M:%S ') + line + '\n')
|
||||
|
||||
|
||||
def norm(u):
|
||||
u = u.replace('\\', '/').strip()
|
||||
if u.endswith('.c'):
|
||||
u = u[:-2]
|
||||
if not u.startswith('source/') and not u.startswith('libs/'):
|
||||
u = 'source/' + u
|
||||
return u
|
||||
|
||||
|
||||
def main():
|
||||
a = sys.argv[1:]
|
||||
if not a:
|
||||
sys.exit(__doc__)
|
||||
cmd = a[0]
|
||||
if cmd == 'show':
|
||||
data = json.load(open(REG, encoding='utf-8')) if os.path.exists(REG) else {}
|
||||
for u, c in sorted(data.items()):
|
||||
if len(a) > 1 and norm(a[1]) != u:
|
||||
continue
|
||||
print('%-60s %-9s %-28s %s' % (u, c['state'], c['agent'], c.get('reason', '')[:90]))
|
||||
return 0
|
||||
unit, agent, text = norm(a[1]), a[2], (a[3] if len(a) > 3 else '')
|
||||
|
||||
def do(data):
|
||||
cur = data.get(unit)
|
||||
if cmd == 'claim':
|
||||
if cur and cur['state'] in ('claimed', 'reserved') and cur['agent'] != agent:
|
||||
print('HELD by %s (%s): %s' % (cur['agent'], cur['state'], cur.get('reason', '')))
|
||||
return 3
|
||||
data[unit] = {'state': 'claimed', 'agent': agent, 'reason': text, 'since': time.time(),
|
||||
'history': (cur or {}).get('history', [])}
|
||||
log('CLAIM %s %s %s' % (unit, agent, text))
|
||||
print('CLAIMED', unit)
|
||||
return 0
|
||||
if cmd == 'release':
|
||||
if not cur or cur['agent'] != agent:
|
||||
print('not your claim:', unit, cur and cur['agent'])
|
||||
return 4
|
||||
hist = cur.get('history', []) + [{'agent': agent, 'outcome': text, 'at': time.time()}]
|
||||
data[unit] = {'state': 'released', 'agent': agent, 'reason': text, 'since': time.time(), 'history': hist}
|
||||
log('RELEASE %s %s %s' % (unit, agent, text))
|
||||
print('RELEASED', unit)
|
||||
return 0
|
||||
if cmd == 'reserve':
|
||||
data[unit] = {'state': 'reserved', 'agent': agent, 'reason': text, 'since': time.time(),
|
||||
'history': (cur or {}).get('history', [])}
|
||||
log('RESERVE %s %s %s' % (unit, agent, text))
|
||||
print('RESERVED', unit)
|
||||
return 0
|
||||
sys.exit('unknown command ' + cmd)
|
||||
|
||||
return locked(do)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main() or 0)
|
||||
@@ -0,0 +1,232 @@
|
||||
2026-09-24 07:40:39 RESERVE source/ai/actor_combat codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 07:40:39 RESERVE source/ai/path_obstacle_avoidance codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 07:40:39 RESERVE source/ai/path_smoothing codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 07:40:39 RESERVE source/math/real_math codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 07:40:39 RESERVE source/physics/collision_features codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 07:40:39 RESERVE source/ai/path_structure_bsp codex Codex packet: actor_combat cross_product2d provider repair + 5 dependents; do not duplicate until Codex reports
|
||||
2026-09-24 08:03:31 CLAIM source/rasterizer/xbox/rasterizer_xbox_hardware_geometry r2w1-rasterizer_xbox_hardware_geometry ADMISSION
|
||||
2026-09-24 08:07:24 CLAIM source/cache/xbox_texture_cache r2w1-xbox_texture_cache ADMISSION
|
||||
2026-09-24 08:07:54 CLAIM source/hs/hs_runtime::_render_debug_trigger_volumes (1088 B) r2w1-hs_runtime::_render_debug_trigger_volumes (1088 B) ATTACK
|
||||
2026-09-24 08:07:54 CLAIM source/hs/hs_runtime r2w1-hs_runtime::_render_debug_trigger_volumes (1088 B) ATTACK _render_debug_trigger_volumes /Od-attested helper form
|
||||
2026-09-24 08:09:11 CLAIM source/hs/hs_runtime (storage: 12 converters) r2w1-hs_runtime (storage: 12 converters) ADMISSION
|
||||
2026-09-24 08:09:30 CLAIM source/ai/actors r2w1-actors ATTACK
|
||||
2026-09-24 08:09:31 CLAIM source/ai/actors r2w1-actors ATTACK
|
||||
2026-09-24 08:16:22 RELEASE source/rasterizer/xbox/rasterizer_xbox_hardware_geometry r2w1-rasterizer_xbox_hardware_geometry OBJECT_COMPLETE_CANDIDATE: hwgeom_B packet refreshed at f6d00a8c (scratch/w/rasterizer_xbox_hardware_geometry/patches 01-03); 17/17 vs emulated split, audit PASS 25/0, pdb 0, link PASS; spelling attested by Sept-2001 linker maps
|
||||
2026-09-24 08:16:51 RELEASE source/hs/hs_runtime (storage: 12 converters) r2w1-hs_runtime (storage: 12 converters) ADMISSION_FIX_PROPOSED: byte-inert static patch for 12 converters (scratch/w/hs_runtime_storage/hs_runtime_converter_storage.patch); audit symbols 12->0, provider_link FAIL(12)->PASS; object still 64/66
|
||||
2026-09-24 08:18:23 CLAIM source/rasterizer/xbox/rasterizer_xbox_hardware_geometry r2review-hwgeom adversarial review of OBJECT_COMPLETE_CANDIDATE hwgeom_B packet (lab builds only)
|
||||
2026-09-24 08:21:51 CLAIM source/rasterizer/xbox/rasterizer_xbox_environment r2w1-rasterizer_xbox_environment ATTACK
|
||||
2026-09-24 08:27:30 RELEASE source/hs/hs_runtime::_render_debug_trigger_volumes (1088 B) r2w1-hs_runtime::_render_debug_trigger_volumes (1088 B) EXACT: /Od helper form (real point_from_line3d, dup tail, sides[2]); gate 65/1; COMDAT IDENTICAL vs action_charge, provider_link PASS; production.patch + park_retire.patch in scratch/w/hs_runtime__render_debug_trigger_volumes
|
||||
2026-09-24 08:27:30 RELEASE source/hs/hs_runtime r2w1-hs_runtime::_render_debug_trigger_volumes (1088 B) trigger_volumes EXACT (function landing proposed, ruling-5 COMDAT); object still blocked by begin_random tie; composes cleanly with storage patch
|
||||
2026-09-24 08:28:52 CLAIM source/bink/bink_playback r2w1-xbox_texture_cache ADMISSION dependency: bitmap_group.h HCEX field rename (bink_playback/bitmaps consumer renames; byte-identical sweep)
|
||||
2026-09-24 08:28:52 CLAIM source/bitmaps/bitmaps r2w1-xbox_texture_cache ADMISSION dependency: bitmap_group.h HCEX field rename (bink_playback/bitmaps consumer renames; byte-identical sweep)
|
||||
2026-09-24 08:28:52 CLAIM source/bitmaps/bitmap_group r2w1-xbox_texture_cache ADMISSION dependency: bitmap_group.h HCEX field rename (bink_playback/bitmaps consumer renames; byte-identical sweep)
|
||||
2026-09-24 08:30:20 CLAIM source/render/render_debug r2w1-xbox_texture_cache ADMISSION dependency: include cache/texture_cache.h for texture_cache_debug_render prototype (byte-identical)
|
||||
2026-09-24 08:32:22 RELEASE source/rasterizer/xbox/rasterizer_xbox_hardware_geometry r2review-hwgeom REVIEW APPROVE: 17/17, audit PASS, pdb 0, link PASS; amended 01 (comment address order) at scratch/w/review_r2_rasterizer_xbox_hardware_geometry/amended/
|
||||
2026-09-24 08:36:05 RELEASE source/ai/actors r2w1-actors r2w1b: 76/76 EXACT (input_update 2384 + spawn 672); OBJECT_COMPLETE_CANDIDATE via final.c (/Od-complete shape); audit PASS; patches in scratch/w/actors (r2w1b_*.patch); a second worker under the same label may still be finalising final.c
|
||||
2026-09-24 08:37:14 RELEASE source/cache/xbox_texture_cache r2w1-xbox_texture_cache OBJECT_COMPLETE_CANDIDATE packet: scratch/w/xbox_texture_cache/patches (01-04 + symbols.json); FINAL full sweep 611/612 identical, texture cache 25/25 + audit PASS vs emulated split; (c) redesigned: texture_cache.h +debug_render only, format mappers in new focused cache/xbox_texture_cache.h (3-proto form regressed decals)
|
||||
2026-09-24 08:37:14 RELEASE source/bink/bink_playback r2w1-xbox_texture_cache OBJECT_COMPLETE_CANDIDATE packet: scratch/w/xbox_texture_cache/patches (01-04 + symbols.json); FINAL full sweep 611/612 identical, texture cache 25/25 + audit PASS vs emulated split; (c) redesigned: texture_cache.h +debug_render only, format mappers in new focused cache/xbox_texture_cache.h (3-proto form regressed decals)
|
||||
2026-09-24 08:37:14 RELEASE source/bitmaps/bitmaps r2w1-xbox_texture_cache OBJECT_COMPLETE_CANDIDATE packet: scratch/w/xbox_texture_cache/patches (01-04 + symbols.json); FINAL full sweep 611/612 identical, texture cache 25/25 + audit PASS vs emulated split; (c) redesigned: texture_cache.h +debug_render only, format mappers in new focused cache/xbox_texture_cache.h (3-proto form regressed decals)
|
||||
2026-09-24 08:37:14 RELEASE source/bitmaps/bitmap_group r2w1-xbox_texture_cache OBJECT_COMPLETE_CANDIDATE packet: scratch/w/xbox_texture_cache/patches (01-04 + symbols.json); FINAL full sweep 611/612 identical, texture cache 25/25 + audit PASS vs emulated split; (c) redesigned: texture_cache.h +debug_render only, format mappers in new focused cache/xbox_texture_cache.h (3-proto form regressed decals)
|
||||
2026-09-24 08:37:14 RELEASE source/render/render_debug r2w1-xbox_texture_cache OBJECT_COMPLETE_CANDIDATE packet: scratch/w/xbox_texture_cache/patches (01-04 + symbols.json); FINAL full sweep 611/612 identical, texture cache 25/25 + audit PASS vs emulated split; (c) redesigned: texture_cache.h +debug_render only, format mappers in new focused cache/xbox_texture_cache.h (3-proto form regressed decals)
|
||||
2026-09-24 08:43:34 RELEASE source/ai/actors r2w1-actors r2w1 primary: 76/76 EXACT, OBJECT AUDIT PASS; land scratch/w/actors/actors_final.patch (sha1 691e8fbc, final.c d9dc3764 = /Od-complete shape incl. SD1 decl order) + parked_retire.patch + config_status.patch; supersedes r2w1b_actors_c_v2.patch (byte-identical object)
|
||||
2026-09-24 09:00:51 CLAIM source/hs/hs_runtime review_r2_hs_runtime adversarial review: build amended /Od-declaration-order patch in scratch/w/review_r2_hs_runtime
|
||||
2026-09-24 09:03:30 RELEASE source/hs/hs_runtime review_r2_hs_runtime review done: approve=false as submitted (F1 /Od declaration order); amended patch scratch/w/review_r2_hs_runtime/amended/production_amended.patch identical object
|
||||
2026-09-24 09:21:15 RELEASE source/rasterizer/xbox/rasterizer_xbox_environment r2w1-rasterizer_xbox_environment FUZZY_IMPROVED: spot /Od shape 960/64 (zero credit, p1 patch); residual proven = M8 +2 + one local round-robin step (forced counterfactual EXACT); C2 local allocator decoded; lightmap_draw owner hold; object blocked
|
||||
2026-09-24 09:28:12 CLAIM source/rasterizer/rasterizer_frame_statistics r2w2-canary Declaration-count canary research (lab only): genuine reason frame_statistics_draw is count-coincident
|
||||
2026-09-24 09:28:43 CLAIM source/text/draw_string r2w2-hygiene-draw_string r2w2 zero-credit ownership packet re-verification (no admission)
|
||||
2026-09-24 09:28:43 CLAIM source/physics/breakable_surfaces r2w2-hygiene-breakable_surfaces r2w2 zero-credit ownership packet re-verification (no admission)
|
||||
2026-09-24 09:28:43 CLAIM source/bink/bink_playback r2w2-hygiene-bink_playback r2w2 zero-credit ownership packet re-verification (no admission)
|
||||
2026-09-24 09:28:43 CLAIM source/rasterizer/xbox/rasterizer_xbox_profile r2w2-hygiene-rasterizer_xbox_profile r2w2 zero-credit ownership packet re-verification (no admission)
|
||||
2026-09-24 09:28:43 CLAIM source/game/players r2w2-hygiene-players r2w2 zero-credit ownership packet re-verification (no admission)
|
||||
2026-09-24 09:42:26 CLAIM source/rasterizer/rasterizer r2w2-hygiene-rasterizer r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:26 CLAIM source/rasterizer/rasterizer_transparent_geometry r2w2-hygiene-rasterizer_transparent_geometry r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:26 CLAIM source/rasterizer/xbox/rasterizer_xbox_active_camouflage r2w2-hygiene-rasterizer_xbox_active_camouflage r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:26 CLAIM source/rasterizer/xbox/rasterizer_xbox_environment r2w2-hygiene-rasterizer_xbox_environment r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:27 CLAIM source/rasterizer/xbox/rasterizer_xbox_models r2w2-hygiene-rasterizer_xbox_models r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:27 CLAIM source/rasterizer/xbox/rasterizer_xbox_transparent_geometry r2w2-hygiene-rasterizer_xbox_transparent_geometry r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:42:27 CLAIM source/rasterizer/xbox/rasterizer_xbox_detail_objects r2w2-hygiene-rasterizer_xbox_detail_objects r2w2 profile ownership packet consumer (01/02/05/06 zero-credit; byte-identity sweep only)
|
||||
2026-09-24 09:54:36 RELEASE source/text/draw_string r2w2-hygiene-draw_string ADMISSION_FIX_PROPOSED zero credit: scratch/w/hygiene_r2w2/draw_string/PACKET_draw_string.patch (src+symbols regen; 27/1 unchanged, pdb 1->0)
|
||||
2026-09-24 09:54:36 RELEASE source/physics/breakable_surfaces r2w2-hygiene-breakable_surfaces ADMISSION_FIX_PROPOSED zero credit: hygiene_r2w2/breakable_surfaces/PACKET (src+config flag drop+symbols; 12/12, audit PASS on emu split, B1/B2 excluded)
|
||||
2026-09-24 09:54:36 RELEASE source/bink/bink_playback r2w2-hygiene-bink_playback ADMISSION_FIX_PROPOSED zero credit: hygiene_r2w2/bink_playback/PACKET (4 statics + symbols; 23/1 unchanged, pdb 5->1)
|
||||
2026-09-24 09:54:36 RELEASE source/rasterizer/xbox/rasterizer_xbox_profile r2w2-hygiene-rasterizer_xbox_profile ADMISSION_FIX_PROPOSED zero credit: hygiene_r2w2/profile PACKET full (models residual model_draw shifts 1 insn, disclosed) or V1 byte-inert subset
|
||||
2026-09-24 09:54:36 RELEASE source/game/players r2w2-hygiene-players no-op: round-1 packet + COMMON supplement already landed in 6e3e2d35
|
||||
2026-09-24 09:54:36 RELEASE source/rasterizer/rasterizer r2w2-hygiene-rasterizer profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/rasterizer_transparent_geometry r2w2-hygiene-rasterizer_transparent_geometry profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/xbox/rasterizer_xbox_active_camouflage r2w2-hygiene-rasterizer_xbox_active_camouflage profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/xbox/rasterizer_xbox_environment r2w2-hygiene-rasterizer_xbox_environment profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/xbox/rasterizer_xbox_models r2w2-hygiene-rasterizer_xbox_models profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/xbox/rasterizer_xbox_transparent_geometry r2w2-hygiene-rasterizer_xbox_transparent_geometry profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:54:37 RELEASE source/rasterizer/xbox/rasterizer_xbox_detail_objects r2w2-hygiene-rasterizer_xbox_detail_objects profile packet consumer: sweep done (only models __rasterizer_model_draw residual shifts under FULL; V1 inert)
|
||||
2026-09-24 09:55:54 CLAIM source/bink/bink_playback review-r2w2-bink_playback adversarial review of storage packet
|
||||
2026-09-24 09:55:54 CLAIM source/physics/breakable_surfaces review-r2w2-breakable_surfaces adversarial review of hygiene_r2w2 breakable_surfaces packet (lab only)
|
||||
2026-09-24 09:56:50 CLAIM source/rasterizer/xbox/rasterizer_xbox_profile review-r2w2-profile-adv adversarial review of hygiene_r2w2 profile packet
|
||||
2026-09-24 09:57:40 CLAIM source/items/projectiles r2w2_projectiles admission packet: single-section semantic_data_matches entry for _projectile_update_section under leaf_map precedent
|
||||
2026-09-24 09:57:45 CLAIM source/units/vehicles r2w2_vehicles admission packet: remove TU-wide REAL_MATH_EXTERNAL_POINT_FROM_LINE3D, /Od-attested point_from_line3d calls, static _update_turret_physics
|
||||
2026-09-24 09:58:12 CLAIM source/ai/actions r2w2_actions admission packet: zero-credit fuzzy re-baseline (production_fuzzy.patch) under house rule 11 precedent
|
||||
2026-09-24 09:58:49 CLAIM source/text/draw_string review-r2w2-draw_string-adv adversarial review of hygiene_r2w2 PACKET_draw_string (read/compile only in scratch/w/review_r2w2_draw_string)
|
||||
2026-09-24 10:05:53 RELEASE source/bink/bink_playback review-r2w2-bink_playback REVIEW approve: storage packet verified (zero credit); REVIEW.md in scratch/w/review_r2w2_bink_playback
|
||||
2026-09-24 10:06:37 CLAIM source/effects/weather_particle_systems r2w2_weather_particle_systems storage-only admission: drop static from one_over_char_max (cachebeta public 0x25AAFC)
|
||||
2026-09-24 10:07:16 RELEASE source/items/projectiles r2w2_projectiles ADMISSION_FIX_PROPOSED: append packet scratch/w/r2w2_projectiles/packet/semantic_data_matches.patch (+1548 data, leaf_map allow_incomplete_unit precedent; all conditions hold; objdiff 3.3.1 '$' defect proven sole cause)
|
||||
2026-09-24 10:10:07 CLAIM source/rasterizer/xbox/rasterizer_xbox_debug r2w2_rasterizer_xbox_debug admission: 8 XDK wrapper rows static (symbols.json) under 05255584 precedent + csplit regen
|
||||
2026-09-24 10:10:15 RELEASE source/ai/actions r2w2_actions FUZZY_IMPROVED zero-credit: land scratch/w/r2w2_actions/production_fuzzy_r2.patch (actions.c + park re-baseline 7ef7a0e0/99.319725, both hunks together); held macro delta layered at held/owner_gated_exact_on_fuzzy.patch
|
||||
2026-09-24 10:10:51 RELEASE source/physics/breakable_surfaces review-r2w2-breakable_surfaces review APPROVE as submitted: 12/12, audit PASS vs emu split, pdb 0, surplus 1 (B1), new COMDAT IDENTICAL+link PASS; REVIEW.md in scratch/w/review_r2w2_breakable_surfaces
|
||||
2026-09-24 10:11:05 CLAIM source/render/render_debug r2w2_render_debug admission packet 05/06 under folded-inline COMDAT + tentative-definition precedent
|
||||
2026-09-24 10:11:54 CLAIM source/objects/object_lights r2w2_object_lights admission packet 01+02+03_NO_ALT under cachebeta-storage + leaf_map allow_incomplete_unit precedent
|
||||
2026-09-24 10:12:14 RELEASE source/rasterizer/xbox/rasterizer_xbox_profile review-r2w2-profile-adv REVIEW: FULL reject (stale models park, undisclosed); V1 reject (07R_V1 SDK precedent stretch); amended V1R approved zero credit: review_r2w2_rasterizer_xbox_profile/PACKET_rasterizer_xbox_profile_V1R_reviewed.patch
|
||||
2026-09-24 10:13:03 CLAIM source/items/weapons r2w2_weapons admission: 11 symbols.json static rows + static weapon_magazine_finish_reload under 05255584 cachebeta-storage precedent + csplit regen
|
||||
2026-09-24 10:13:13 RELEASE source/text/draw_string review-r2w2-draw_string-adv REVIEW approve (amended: short encoding_shift) scratch/w/review_r2w2_draw_string/PACKET_draw_string_AMENDED.patch
|
||||
2026-09-24 10:13:25 RELEASE source/units/vehicles r2w2_vehicles ADMISSION_FIX_PROPOSED zero credit: scratch/w/r2w2_vehicles/patches/01+02 (ruling #1 COVERED, all conditions verified; 37/2 unchanged, object_audit symbols 1->0, provider_link 86/86 PASS); optional 03 scale_vector3d byte-inert
|
||||
2026-09-24 10:14:35 RELEASE source/rasterizer/rasterizer_frame_statistics r2w2-canary RESEARCH_ONLY: period-64 C1-record law; measured zero-loss packet (rlr+vp+matrix_math+collisions+swcw+bdB, +4752 move_point) held for Codex real_math reservation + owner dup-copy ruling; see scratch/w/canary_frame_statistics/MANIFEST.md
|
||||
2026-09-24 10:15:11 CLAIM source/text/draw_string r2w2_draw_string rebuild .bss ownership admission packet (4 HCEX file statics = { 0 }, symbols.json re-cut) under a595bbc2/7979cf8f precedent at 434f0151
|
||||
2026-09-24 10:15:55 CLAIM source/units/vehicles review_r2w2_vehicles_rv1 adversarial review of r2w2_vehicles admission fix; may produce amended patch in scratch/w/review_r2w2_vehicles
|
||||
2026-09-24 10:19:44 RELEASE source/effects/weather_particle_systems r2w2_weather_particle_systems ADMISSION_FIX_PROPOSED zero-credit: patches/01 one_over_char_max external (cachebeta public; precedent 6e3e2d35 hs _hs_type_real_default); optional patches/02 weather_particle_system_globals static (+symbols.json, emu split pdb 0); object still blocked by render class-I + _real_local_random provider
|
||||
2026-09-24 10:20:03 CLAIM source/render/render r2w2_object_lights header-consumer verification only (object_lights_rendering.h loses should_render_lights prototype); no source edit
|
||||
2026-09-24 10:20:03 CLAIM source/render/render_objects r2w2_object_lights header-consumer verification only (object_lights_rendering.h loses should_render_lights prototype); no source edit
|
||||
2026-09-24 10:20:05 RELEASE source/rasterizer/xbox/rasterizer_xbox_debug r2w2_rasterizer_xbox_debug OBJECT_COMPLETE_CANDIDATE (storage-only): scratch/w/r2w2_rasterizer_xbox_debug/patches/01_symbols.json.patch; split radius 1; gate 18/18; object_audit FAIL(8)->PASS; pdb 0; link PASS 7/7; credit-neutral
|
||||
2026-09-24 10:20:23 RELEASE source/render/render r2w2_object_lights consumer verification done: shadow-tree compile with 01's object_lights_rendering.h is objcmp IDENTICAL to build/base (render 13/13, render_objects 22/22); no source change
|
||||
2026-09-24 10:20:23 RELEASE source/render/render_objects r2w2_object_lights consumer verification done: shadow-tree compile with 01's object_lights_rendering.h is objcmp IDENTICAL to build/base (render 13/13, render_objects 22/22); no source change
|
||||
2026-09-24 10:20:51 CLAIM source/effects/weather_particle_systems review_r2w2_weather_psys adversarial review of storage packet (01 one_over_char_max external, 02 globals static)
|
||||
2026-09-24 10:27:29 RELEASE source/items/weapons r2w2_weapons ADMISSION_FIX_PROPOSED zero-credit: land scratch/w/r2w2_weapons/patches/01_weapons.c.patch + 02_symbols.json.patch together + csplit regen; audit FAIL(11)->FAIL(1) (_weapon_place only), pdb 12->1, 78/79 unchanged
|
||||
2026-09-24 10:29:48 CLAIM source/rasterizer/xbox/rasterizer_xbox_debug review_r2w2_rasterizer_xbox_debug_rv1 adversarial review of r2w2 storage-only static-wrapper symbols.json packet; read-only measurement
|
||||
2026-09-24 10:29:54 RELEASE source/units/vehicles review_r2w2_vehicles_rv1 REVIEW APPROVE 01+02 zero-credit (ruling 1 literal case; rule-6 exception conditions verified); optional 03 verified inert; scratch/w/review_r2w2_vehicles/REVIEW.md
|
||||
2026-09-24 10:30:25 RELEASE source/text/draw_string r2w2_draw_string ADMISSION_FIX_PROPOSED zero credit: scratch/w/r2w2_draw_string/PACKET_draw_string.patch (01 src + 02 symbols.json in-place re-cut; csplit regen); cand vs emu split 27/1 unchanged, audit 49/0 syms, pdb 1->0, link PASS; object still blocked by owner-held _bitmap_draw_string BUG body
|
||||
2026-09-24 10:31:31 RELEASE source/objects/object_lights r2w2_object_lights ADMISSION_FIX_PROPOSED: land scratch/w/r2w2_object_lights/patches 01+02 (+csplit regen) then 03_NO_ALT; 43/43, audit PASS vs emulated split, pdb 0, link PASS; +1541 data; object stays NonMatching on Q1
|
||||
2026-09-24 10:31:34 CLAIM source/text/draw_string review-r2w2-draw_string-adv2 adversarial review (second) of r2w2 ownership packet; lab compiles only
|
||||
2026-09-24 10:32:29 RELEASE source/render/render_debug r2w2_render_debug ADMISSION_FIX_PROPOSED zero-credit: land scratch/w/r2w2_render_debug/patches/05 then 06 (36/36, audit PASS, sweep 611/612 identical, pfl3d COMDAT IDENTICAL + link PASS); completion still needs owner Q2d + 08
|
||||
2026-09-24 10:32:50 RELEASE source/rasterizer/xbox/rasterizer_xbox_debug review_r2w2_rasterizer_xbox_debug_rv1 APPROVE: storage-only packet verified; amended LF patch scratch/w/review_r2w2_rasterizer_xbox_debug/patches/01_symbols.json.patch (applies wt/--index/--cached)
|
||||
2026-09-24 10:35:09 CLAIM source/render/render_debug review_r2w2_render_debug_rv1 adversarial review of 05/06 admission packet; amended patch only if fixable
|
||||
2026-09-24 10:35:41 CLAIM source/objects/object_lights review_r2w2_object_lights_rv1 adversarial review of 01/02/03_NO_ALT admission packet; lab compiles only
|
||||
2026-09-24 10:37:26 RELEASE source/effects/weather_particle_systems review_r2w2_weather_psys review APPROVE: 01 oocm external + optional atomic 02 globals static with symbols.json 22981; zero credit; REVIEW.md in scratch/w/review_r2w2_weather_particle_systems
|
||||
2026-09-24 10:45:20 RELEASE source/text/draw_string review-r2w2-draw_string-adv2 adv2 APPROVE PACKET_draw_string.patch (zero credit ownership); review in scratch/w/review_r2w2_draw_string/REVIEW.md
|
||||
2026-09-24 10:50:07 RELEASE source/objects/object_lights review_r2w2_object_lights_rv1 REVIEW APPROVE: 01+02(+csplit regen)+03_NO_ALT verified independently; no amendment; see scratch/w/review_r2w2_object_lights/REVIEW.md
|
||||
2026-09-24 11:03:28 RELEASE source/render/render_debug review_r2w2_render_debug_rv1 REVIEW APPROVE 05+06 zero-credit; recommend amended 05a (adds /Od-attested pfl2d/arctangent/plane3d_distance/set_real_point3d x26) + 06; 05b rotate_vector2d optional (ruling-3 casts)
|
||||
2026-09-24 12:00:04 CLAIM source/interface/ui_widget_game_data_input_functions record-synthesis LAB ONLY synthesis: genuine +2/+3 record sources for solo count tie; no landing
|
||||
2026-09-24 12:36:12 RELEASE source/interface/ui_widget_game_data_input_functions record-synthesis RESEARCH_ONLY: solo closes only with JAN real_math tier+swcw+PU (J1, loses 5); PU/MN zero-loss hygiene; R now needs V/E compensator; see scratch/w/record_synthesis
|
||||
2026-09-24 13:02:00 CLAIM source/bink/bink_playback critic_r2 LAB ONLY: test static empty bink_decompress_audio_frame (Sept-2001 map name for _code_001b5850) emission; no landing
|
||||
2026-09-24 13:02:39 RELEASE source/bink/bink_playback critic_r2 LAB: static used empty stub -> emitted EXACT (23/24 unchanged); static unused -> dropped. Name bink_decompress_audio_frame from Sept-2001 map. Evidence scratch/w/critic_r2/bink/
|
||||
2026-09-24 13:09:11 CLAIM source/hs/hs_compile critic_r2 LAB ONLY: PDB-public storage of whitespace/eol/primitive_parsers tables + hs_compile_finish static; no landing
|
||||
2026-09-24 13:10:08 RELEASE source/hs/hs_compile critic_r2 LAB: tables extern + hs_compile_finish static are byte-inert (61/64 unchanged, only storage differs). Evidence scratch/w/critic_r2/hs_compile/
|
||||
2026-09-24 13:17:52 CLAIM source/hs/hs_compile critic_2_hs_compile storage packet: extern whitespace/eol/primitive parser tables, static hs_compile_finish
|
||||
2026-09-24 13:17:59 CLAIM source/bink/bink_playback critic_0_bink_playback critic route: rename _code_001b5850 -> static bink_decompress_audio_frame (used stub), symbols.json static row, csplit regen
|
||||
2026-09-24 13:18:43 CLAIM source/ai/ai_debug critic_3 rename-only hygiene: Sept-2001 first-party names for _code_ placeholders (byte-inert check)
|
||||
2026-09-24 13:29:49 CLAIM source/hs/hs critic_2_hs_compile header consumer sweep: hs_library_internal_compile.h loses hs_compile_finish prototype (no hs.c edit)
|
||||
2026-09-24 13:30:34 CLAIM source/bungie_net/network/transport_endpoint_winsock critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/bungie_net/network/transport_endpoint_set_winsock critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/cseries/profile critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/interface/progress_bar critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/networking/network_connection critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/saved games/saved_game_files critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/rasterizer/xbox/rasterizer_xbox_profile critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/cache/xbox_sound_cache critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:34 CLAIM source/game/game_engine_king critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/game/players critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/hs/hs_runtime critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/main/main critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/effects/decals critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/rasterizer/rasterizer_lights critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/rasterizer/xbox/rasterizer_xbox_dynavobgeom critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/rasterizer/xbox/rasterizer_xbox_environment_fog critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:30:35 CLAIM source/render/render_cameras critic_3 rename-only hygiene: Sept-2001 first-party map names (byte-inert check, emulated split)
|
||||
2026-09-24 13:31:55 RELEASE source/hs/hs critic_2_hs_compile header consumer sweep done: hs.obj byte-identical with hs_compile_finish prototype removed from hs_library_internal_compile.h
|
||||
2026-09-24 13:31:56 RELEASE source/hs/hs_compile critic_2_hs_compile ADMISSION_FIX_PROPOSED: storage packet (3 tables extern, hs_compile_finish static + symbols.json 4 rows) byte-inert, pdb_storage 4->0; patch scratch/w/critic_2_hs_compile/hs_compile_storage.patch
|
||||
2026-09-24 13:33:13 CLAIM source/hs/hs_compile review_critic_2_hs_compile adversarial review of critic_2 storage packet (compile candidates in scratch only)
|
||||
2026-09-24 13:33:13 CLAIM source/hs/hs review_critic_2_hs_compile header consumer check for critic_2 hs_compile storage packet
|
||||
2026-09-24 13:34:14 RELEASE source/bink/bink_playback critic_0_bink_playback ADMISSION_FIX_PROPOSED zero-credit: scratch/w/critic_0_bink_playback/patches 01+02 atomic (+csplit regen), optional 03 hygiene; cand 23/1 vs emu split, audit FAIL(1)=q3 only, pdb 0; with q3 lab 24/0 PASS
|
||||
2026-09-24 13:35:43 CLAIM source/bink/bink_playback review_critic_0_bink_playback adversarial review of critic_0 naming packet (labs only)
|
||||
2026-09-24 13:38:13 CLAIM source/game/game critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:13 CLAIM source/interface/marketing_and_strategic_business_development critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/interface/player_ui critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/interface/ui_widget critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/interface/virtual_keyboard critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/render/render critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/saved games/player_profile critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:38:14 CLAIM source/saved games/playlist_profile critic_3 header-consumer verification only (progress_bar.h / saved_game_files.h prototype renames); no source edit
|
||||
2026-09-24 13:44:07 RELEASE source/hs/hs_compile review_critic_2_hs_compile REVIEW APPROVE critic_2 storage packet as submitted (zero credit); evidence scratch/w/review_critic_2_hs_compile/
|
||||
2026-09-24 13:44:07 RELEASE source/hs/hs review_critic_2_hs_compile header consumer verified: hs.obj 0 section/symbol diffs with patched header
|
||||
2026-09-24 13:47:36 CLAIM source/hs/hs critic_3 rename-only hygiene: Sept-2001 map names for 3 radiosity evaluators (byte-inert check, emulated split)
|
||||
2026-09-24 13:49:55 RELEASE source/bink/bink_playback review_critic_0_bink_playback APPROVE critic_0 naming packet 01+02 (03 optional ok); zero credit; see scratch/w/review_critic_0_bink_playback/LEDGER.md
|
||||
2026-09-24 13:59:57 RELEASE source/ai/ai_debug critic_3 ADMISSION_FIX_PROPOSED zero-credit: scratch/w/critic_3/patches/01_ai_debug.patch (21 code_ statics -> Sept-2001 map names + static rows; dead stub removed) + optional 02 (11 static rows); byte-inert (objdiff same); audit FAIL34->13(->2 with 02), pdb 33->12(->1)
|
||||
2026-09-24 13:59:57 RELEASE source/bungie_net/network/transport_endpoint_winsock critic_3 names-only packet scratch/w/critic_3/patches/03_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:57 RELEASE source/bungie_net/network/transport_endpoint_set_winsock critic_3 names-only packet scratch/w/critic_3/patches/04_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:57 RELEASE source/cseries/profile critic_3 names-only packet scratch/w/critic_3/patches/05_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:57 RELEASE source/interface/progress_bar critic_3 names-only packet scratch/w/critic_3/patches/06_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:57 RELEASE source/networking/network_connection critic_3 names-only packet scratch/w/critic_3/patches/07_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:57 RELEASE source/saved games/saved_game_files critic_3 names-only packet scratch/w/critic_3/patches/08_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/rasterizer/xbox/rasterizer_xbox_profile critic_3 names-only packet scratch/w/critic_3/patches/09_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/cache/xbox_sound_cache critic_3 names-only packet scratch/w/critic_3/patches/10_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/game/game_engine_king critic_3 names-only packet scratch/w/critic_3/patches/11_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/game/players critic_3 names-only packet scratch/w/critic_3/patches/12_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/hs/hs critic_3 names-only packet scratch/w/critic_3/patches/13_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/hs/hs_runtime critic_3 names-only packet scratch/w/critic_3/patches/14_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/main/main critic_3 names-only packet scratch/w/critic_3/patches/15_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/effects/decals critic_3 names-only packet scratch/w/critic_3/patches/16_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/rasterizer/rasterizer_lights critic_3 names-only packet scratch/w/critic_3/patches/17_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:58 RELEASE source/rasterizer/xbox/rasterizer_xbox_dynavobgeom critic_3 names-only packet scratch/w/critic_3/patches/18_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:59 RELEASE source/rasterizer/xbox/rasterizer_xbox_environment_fog critic_3 names-only packet scratch/w/critic_3/patches/19_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:59 RELEASE source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps critic_3 names-only packet scratch/w/critic_3/patches/20_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:59 RELEASE source/render/render_cameras critic_3 names-only packet scratch/w/critic_3/patches/21_*.patch: Sept-2001 first-party names, byte-inert (gate rows + objdiff identical, emulated split rename-only); zero credit; see scratch/w/critic_3/MANIFEST.md
|
||||
2026-09-24 13:59:59 RELEASE source/game/game critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 13:59:59 RELEASE source/interface/marketing_and_strategic_business_development critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 13:59:59 RELEASE source/interface/player_ui critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 13:59:59 RELEASE source/interface/ui_widget critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 13:59:59 RELEASE source/interface/virtual_keyboard critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 13:59:59 RELEASE source/render/render critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 14:00:00 RELEASE source/saved games/player_profile critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 14:00:00 RELEASE source/saved games/playlist_profile critic_3 header-consumer verification: object IDENTICAL with renamed progress_bar.h/saved_game_files.h prototypes; no source edit
|
||||
2026-09-24 14:02:54 CLAIM source/ai/ai_debug review_critic_3_ai_debug adversarial review of critic_3 01/02 ai_debug rename packet (candidate copies only)
|
||||
2026-09-24 14:20:10 RELEASE source/ai/ai_debug review_critic_3_ai_debug REVIEW approve-with-amendment: scratch/w/review_critic_3_ai_debug/01_ai_debug_amended.patch (orphan stub comment moved) + optional critic_3 02; byte-inert, zero credit; gate 59/1 rows same, audit 34->13(->2), pdb 33->12(->1)
|
||||
2026-09-24 14:21:31 CLAIM source/bungie_net/network/transport_endpoint_winsock review_critic_3_winsock adversarial review of critic_3 patch 03 (names-only); compile candidate in own slug
|
||||
2026-09-24 14:33:01 RELEASE source/bungie_net/network/transport_endpoint_winsock review_critic_3_winsock review of critic_3 patch 03: APPROVE (names-only, byte-inert, parked key validated; see scratch/w/review_critic_3_transport_endpoint_winsock/LEDGER.md)
|
||||
2026-09-24 14:34:16 CLAIM source/bungie_net/network/transport_endpoint_set_winsock review_critic_3_tesw04 adversarial review of critic_3 patch 04 (names-only); candidate compiles only in scratch/w/review_critic_3_tesw04
|
||||
2026-09-24 14:47:54 RELEASE source/bungie_net/network/transport_endpoint_set_winsock review_critic_3_tesw04 review of critic_3 patch 04: APPROVE (names-only, byte-inert; Sept+Aug+retail maps, raw-byte body identity, parked key validated; see scratch/w/review_critic_3_tesw04/LEDGER.md)
|
||||
2026-09-24 14:51:33 CLAIM source/cseries/profile review_critic_3_profile adversarial review of critic_3 patch 05 (rename-only verification compiles)
|
||||
2026-09-24 14:58:59 RELEASE source/cseries/profile review_critic_3_profile review of critic_3 05_profile: APPROVE (byte-inert Sept renames, verified)
|
||||
2026-09-24 15:02:29 CLAIM source/interface/progress_bar review_critic_3_progress_bar adversarial review of critic_3 patch 06 (names + Texture8_Release); verification only, no landing
|
||||
2026-09-24 15:14:21 RELEASE source/interface/progress_bar review_critic_3_progress_bar review APPROVE: patch 06 names-only, byte-inert, gate 53/1 same rows, audit/pdb/surplus/link identical, objdiff identical
|
||||
2026-09-24 15:15:22 CLAIM source/networking/network_connection review_critic_3_network_connection adversarial review of critic_3 patch 07 (names-only)
|
||||
2026-09-24 15:24:38 RELEASE source/networking/network_connection review_critic_3_network_connection REVIEW APPROVE critic_3 patch 07 (names-only, byte-inert; Sept+Aug maps, raw bytes 23/23, 10/10 call edges, Jan-hash atlas); see scratch/w/review_critic_3_network_connection/LEDGER.md
|
||||
2026-09-24 15:26:05 CLAIM source/saved games/saved_game_files review_critic_3_saved_game_files adversarial review of critic_3 patch 08 (names-only)
|
||||
2026-09-24 15:34:55 CLAIM source/game/game review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/interface/marketing_and_strategic_business_development review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/interface/player_ui review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/interface/ui_widget review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/interface/virtual_keyboard review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/saved games/player_profile review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:34:55 CLAIM source/saved games/playlist_profile review_critic_3_saved_game_files verification-only: compile with patch-08 saved_game_files.h shadow
|
||||
2026-09-24 15:35:55 RELEASE source/game/game review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/interface/marketing_and_strategic_business_development review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/interface/player_ui review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/interface/ui_widget review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/interface/virtual_keyboard review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/saved games/player_profile review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:35:55 RELEASE source/saved games/playlist_profile review_critic_3_saved_game_files verification-only: identical objects with patch-08 header (probe-proven shadow)
|
||||
2026-09-24 15:44:49 RELEASE source/saved games/saved_game_files review_critic_3_saved_game_files REVIEW APPROVE critic_3 patch 08 (names-only, byte-inert; raw-byte Sept identity 4/4; consumer shadow hole closed; oq02 rebase at scratch/w/review_critic_3_saved_game_files)
|
||||
2026-09-24 15:46:22 CLAIM source/rasterizer/xbox/rasterizer_xbox_profile review_critic_3_rasterizer_xbox_profile adversarial review of critic_3 patch 09 (names-only, lab candidates in scratch/w/review_critic_3_rasterizer_xbox_profile)
|
||||
2026-09-24 15:59:12 RELEASE source/rasterizer/xbox/rasterizer_xbox_profile review_critic_3_rasterizer_xbox_profile REVIEW APPROVE critic_3 patch 09 (names-only, byte-inert, Sept cachebeta+retail maps, 0 non-reloc byte diffs); optional 09b rejection-prose patch; see scratch/w/review_critic_3_rasterizer_xbox_profile
|
||||
2026-09-24 16:00:36 CLAIM source/cache/xbox_sound_cache review_critic_3_xbox_sound_cache adversarial review of critic_3 patch 10 (rename sound_cache_debug_block_name)
|
||||
2026-09-24 16:13:29 RELEASE source/cache/xbox_sound_cache review_critic_3_xbox_sound_cache review of critic_3 patch 10: APPROVE unchanged (byte-inert authentic rename; conflicts textually with pending storage packet A -> rebased companion in scratch/w/review_critic_3_xbox_sound_cache/)
|
||||
2026-09-24 16:14:47 CLAIM source/game/game_engine_king review_critic_3_king adversarial review of critic_3 patch 11 (hill_points_to_2d -> point3d_to_point2d); lab compile only
|
||||
2026-09-24 16:27:06 RELEASE source/game/game_engine_king review_critic_3_king review of critic_3 patch 11: APPROVE unchanged (byte-inert; Aug/Sept/retail maps + raw-byte-identical bodies; held owner packet 02 needs 1-line context rebase, copy in scratch/w/review_critic_3_king)
|
||||
2026-09-24 16:28:10 CLAIM source/game/players review_critic_3_players adversarial review of critic_3 patch 12 (create_weapon rename); verification only
|
||||
2026-09-24 16:40:53 RELEASE source/game/players review_critic_3_players interrupted by integrator (workflow stopped to parallelise reviews); review re-run as review_critic3_players
|
||||
2026-09-24 16:41:07 CLAIM source/rasterizer/xbox/rasterizer_xbox_dynavobgeom review_critic3_dynavobgeom adversarial review of critic_3 patch 18 (submit_screen_vertex rename)
|
||||
2026-09-24 16:41:09 CLAIM source/hs/hs review_critic3_hs adversarial review of critic_3 patch 13 (radiosity_hack_* renames); candidate compiles only in scratch/w/review_critic3_hs
|
||||
2026-09-24 16:41:12 CLAIM source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps review_critic3_rasterizer_xbox_hardware_bitmaps adversarial review of critic_3 patch 20 (rename cube_map->cm)
|
||||
2026-09-24 16:41:12 CLAIM source/main/main review_critic3_main adversarial review of critic_3 patch 15 (rename sort_controllers_ascending); candidate compile only
|
||||
2026-09-24 16:41:13 CLAIM source/rasterizer/rasterizer_lights review_critic3_rasterizer_lights adversarial review of critic_3 patch 17 (rename lens_flare_submit_parameter_get->lens_flare_parameters_get); verification only
|
||||
2026-09-24 16:41:14 CLAIM source/render/render_cameras review_critic3_render_cameras adversarial review of critic_3 patch 21 (render_camera_warn_once rename)
|
||||
2026-09-24 16:41:15 CLAIM source/rasterizer/xbox/rasterizer_xbox_environment_fog review_critic3_rasterizer_xbox_environment_fog adversarial review of critic_3 patch 19 (screen_is_active rename)
|
||||
2026-09-24 16:41:16 CLAIM source/hs/hs_runtime review_critic3_hs_runtime adversarial review of critic_3 patch 14 (script_error rename); verification only
|
||||
2026-09-24 16:41:17 CLAIM source/game/players review_critic3_players adversarial review of critic_3 patch 12 (create_weapon rename); lab compiles only under scratch/w/review_critic3_players
|
||||
2026-09-24 16:41:29 CLAIM source/effects/decals review_critic3_decals adversarial review of critic_3 patch 16 (rename only, candidate compile in own slug)
|
||||
2026-09-24 16:51:41 RELEASE source/game/players review_critic3_players REVIEW APPROVE unchanged: critic_3 patch 12 create_weapon rename byte-inert and first-party attested (Aug/Sept/retail maps, Sept body identical, HCEX, /Od); see scratch/w/review_critic3_players/LEDGER.md
|
||||
2026-09-24 16:51:43 RELEASE source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps review_critic3_rasterizer_xbox_hardware_bitmaps review APPROVE: patch 20 byte-inert, first-party name triple-attested
|
||||
2026-09-24 16:52:46 RELEASE source/render/render_cameras review_critic3_render_cameras REVIEW approve unchanged: patch 21 byte-inert authentic rename (Sept+Aug maps, Jan atlas, raw-byte body identity, 22 callers); see scratch/w/review_critic3_render_cameras/
|
||||
2026-09-24 16:52:56 RELEASE source/hs/hs_runtime review_critic3_hs_runtime review done: APPROVE patch 14 (script_error) byte-inert, first-party name verified; no amendment
|
||||
2026-09-24 16:53:28 RELEASE source/effects/decals review_critic3_decals review done: patch 16 rename-only verified byte-inert; APPROVE (no amendment)
|
||||
2026-09-24 16:53:29 RELEASE source/rasterizer/rasterizer_lights review_critic3_rasterizer_lights review done: APPROVE patch 17 as-is (byte-inert rename, independently verified)
|
||||
2026-09-24 16:54:59 RELEASE source/rasterizer/xbox/rasterizer_xbox_environment_fog review_critic3_rasterizer_xbox_environment_fog REVIEW APPROVE critic_3 patch 19 unchanged (names-only, byte-inert; Sept/Aug/retail maps + raw-byte Sept identity 0/512 + 42 relocs + 4 callers; emulated split rename-only; gate 26/1 same rows; objdiff identical); see scratch/w/review_critic3_rasterizer_xbox_environment_fog/
|
||||
2026-09-24 16:55:03 RELEASE source/hs/hs review_critic3_hs REVIEW APPROVE critic_3 patch 13 as submitted (names-only, byte-inert; Aug/Sept XBE .rdata def structs + 3 maps prove radiosity_hack_*; gate 447/1 same rows; objcmp/audit/pdb/surplus/link/objdiff unchanged; combined with critic_2 hdr identical). scratch/w/review_critic3_hs
|
||||
2026-09-24 16:55:27 RELEASE source/rasterizer/xbox/rasterizer_xbox_dynavobgeom review_critic3_dynavobgeom review APPROVE patch 18 as-is: two Sept-2001 maps + identical body; gate 17/0 vs emulated split; objcmp identical; zero credit
|
||||
2026-09-24 16:55:51 RELEASE source/main/main review_critic3_main review complete: patch 15 approved as-is (name-only, zero credit, all checks identical)
|
||||
@@ -0,0 +1,97 @@
|
||||
"""Copy curated worker evidence from ignored scratch/ into tracked research/fifty_objects_20260925/.
|
||||
|
||||
python scratch/campaign/curate.py
|
||||
|
||||
Copies, per scratch/w/<slug>/: every *.md, *.patch and *.diff (outside split/ and config/ copies),
|
||||
plus a diff against the tree for every .c candidate that wave results name in candidate_files; and every wave result/review record under scratch/campaign/wave*/units/.
|
||||
Skips any single file over 400 KB (listed in SKIPPED.txt). .obj, split and symbols.json copies are
|
||||
never copied. Idempotent: re-running overwrites with the current scratch contents.
|
||||
"""
|
||||
import glob
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
os.chdir(ROOT)
|
||||
DEST = os.path.join('research', 'fifty_objects_r2_20260924')
|
||||
LIMIT = 400 * 1024
|
||||
skipped = []
|
||||
copied = 0
|
||||
|
||||
|
||||
def want_dir(rel):
|
||||
parts = rel.replace('\\', '/').split('/')
|
||||
return not any(p in ('split', 'config', '__pycache__') or p.startswith('split_') for p in parts)
|
||||
|
||||
|
||||
def copy(src, dst):
|
||||
global copied
|
||||
if os.path.getsize(src) > LIMIT:
|
||||
skipped.append('%s (%d bytes)' % (src, os.path.getsize(src)))
|
||||
return
|
||||
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
||||
shutil.copyfile(src, dst)
|
||||
copied += 1
|
||||
|
||||
|
||||
for slug in sorted(os.listdir(os.path.join('scratch', 'w'))):
|
||||
base = os.path.join('scratch', 'w', slug)
|
||||
if not os.path.isdir(base):
|
||||
continue
|
||||
for dirpath, dirnames, filenames in os.walk(base):
|
||||
rel = os.path.relpath(dirpath, base)
|
||||
if not want_dir(rel):
|
||||
dirnames[:] = []
|
||||
continue
|
||||
for f in filenames:
|
||||
ext = os.path.splitext(f)[1].lower()
|
||||
if ext in ('.md', '.patch', '.diff') or f.startswith('APPLY_ORDER') or f == 'SHA256SUMS.txt':
|
||||
copy(os.path.join(dirpath, f), os.path.join(DEST, 'w', slug, rel, f))
|
||||
|
||||
# named candidate sources are stored as diffs against the tree's version of the unit's .c
|
||||
named = {}
|
||||
for res in glob.glob(os.path.join('scratch', 'campaign', 'r2w*', 'result.json')):
|
||||
data = json.load(open(res, encoding='utf-8'))
|
||||
for r in data.get('results', []):
|
||||
for u in (r or {}).get('units', []) or []:
|
||||
src = (u.get('unit') or '').split(' ')[0]
|
||||
src = src if src.endswith('.c') else src + '.c'
|
||||
for c in u.get('candidate_files', []) or []:
|
||||
if c.lower().endswith('.c'):
|
||||
named[os.path.normpath(c)] = src
|
||||
for c, src in sorted(named.items()):
|
||||
rel = os.path.relpath(c, os.path.join(ROOT, 'scratch', 'w'))
|
||||
if rel.startswith('..') or not os.path.exists(c):
|
||||
continue
|
||||
dst = os.path.join(DEST, 'w', rel[:-2] + '.vs_tree.diff')
|
||||
if os.path.exists(src):
|
||||
d = subprocess.run(['git', 'diff', '--no-index', '--ignore-cr-at-eol', src, c], capture_output=True, text=True,
|
||||
encoding='utf-8', errors='replace').stdout
|
||||
if d and len(d) > 60000:
|
||||
skipped.append('%s (diff vs %s is %d bytes; wrong mapping or whole-file rewrite)' % (c, src, len(d)))
|
||||
elif d:
|
||||
os.makedirs(os.path.dirname(dst), exist_ok=True)
|
||||
open(dst, 'w', encoding='utf-8', newline='\n').write(d)
|
||||
copied += 1
|
||||
else:
|
||||
copy(c, os.path.join(DEST, 'w', rel))
|
||||
|
||||
for rec in glob.glob(os.path.join('scratch', 'campaign', 'r2w*', 'units', '*.md')):
|
||||
wave = rec.split(os.sep)[-3]
|
||||
copy(rec, os.path.join(DEST, 'results', wave, os.path.basename(rec)))
|
||||
|
||||
# the integrator kit that applies these packets
|
||||
for f in ('batch_gate.py', 'admit.py', 'sym_edit.py', 'sym_ops_from_copy.py', 'rebaseline_parks.py', 'audit_battery.py', 'curate.py', 'WORKER_BRIEF_R2.md', 'claim.py', 'board.py', 'hints.py', 'claims.log'):
|
||||
if os.path.exists(os.path.join('scratch', 'campaign', f)):
|
||||
copy(os.path.join('scratch', 'campaign', f), os.path.join(DEST, 'integrator_kit', f))
|
||||
copy(os.path.join('scratch', 'patch_ninja.py'), os.path.join(DEST, 'integrator_kit', 'patch_ninja.py'))
|
||||
with open(os.path.join(DEST, '.gitattributes'), 'w', newline='\n') as fh:
|
||||
fh.write('# evidence copies are kept byte-for-byte (patches must still apply) and are not style-checked\n'
|
||||
'* -text -whitespace\n')
|
||||
with open(os.path.join(DEST, 'SKIPPED.txt'), 'w', encoding='utf-8', newline='\n') as fh:
|
||||
fh.write('Files over %d bytes left in scratch (not copied):\n' % LIMIT)
|
||||
for s in skipped:
|
||||
fh.write(s + '\n')
|
||||
print('copied', copied, 'skipped', len(skipped))
|
||||
@@ -0,0 +1,71 @@
|
||||
"""Per-object hint packets for triage agents (read-only).
|
||||
|
||||
python scratch/campaign/hints.py -> scratch/campaign/hints.json
|
||||
|
||||
For each incomplete Halo unit on the board: missing functions with structural class
|
||||
(S1 reference multiset differs / S2 instruction count differs / T tie-shaped), frame
|
||||
sizes (target vs ours), park class + first 400 chars of park evidence, rejections,
|
||||
audit/link failures, prior ledger file names and round-1 result files.
|
||||
"""
|
||||
import collections
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
os.chdir(ROOT)
|
||||
src = open('tools/campaign/structural_split.py', encoding='utf-8').read()
|
||||
ns = {'__file__': os.path.join(ROOT, 'tools', 'campaign', 'structural_split.py')}
|
||||
exec(compile(src[:src.index('\nrows = []')], 'structural_split', 'exec'), ns)
|
||||
read, real_code = ns['read'], ns['real_code']
|
||||
|
||||
FRAME = re.compile(rb'\x81\xec(....)|\x83\xec(.)', re.S)
|
||||
|
||||
|
||||
def frame(body):
|
||||
m = FRAME.search(body[:64])
|
||||
if not m:
|
||||
return 0
|
||||
return int.from_bytes(m.group(1), 'little') if m.group(1) else m.group(2)[0]
|
||||
|
||||
|
||||
board = json.load(open('scratch/campaign/board.json'))
|
||||
parks = {(p['unit'], p['function']): p for p in json.load(open('config/parked.json'))['entries']}
|
||||
rej = collections.defaultdict(list)
|
||||
for r in json.load(open('config/object_admission_rejections.json'))['entries']:
|
||||
rej[r['unit']].append({'class': r['class'], 'symbol': r['symbol'], 'reopen': r.get('reopen', '')[:400]})
|
||||
logs = sorted(os.listdir('docs/object_matching_logs'))
|
||||
r1 = []
|
||||
for dp, _d, fs in os.walk('research/fifty_objects_20260925/results'):
|
||||
r1 += [os.path.join(dp, f).replace('\\', '/') for f in fs]
|
||||
out = {}
|
||||
for row in board:
|
||||
unit = row['unit']
|
||||
base = unit.rsplit('/', 1)[1]
|
||||
tgt = read(os.path.join('build', 'split', unit + '.obj'))
|
||||
ours = read(os.path.join('build', 'base', unit + '.obj'))
|
||||
fns = []
|
||||
for name, size, st, pk in row['missing']:
|
||||
t, o = tgt.get(name), ours.get(name)
|
||||
cls = '?'
|
||||
info = {}
|
||||
if t and o:
|
||||
tr, orr = collections.Counter(t[1]), collections.Counter(o[1])
|
||||
ti, oi = real_code(t[0])[0], real_code(o[0])[0]
|
||||
cls = 'S1' if tr != orr else ('S2' if ti != oi else 'T')
|
||||
info = {'insn_target': ti, 'insn_ours': oi, 'frame_target': frame(t[0]), 'frame_ours': frame(o[0]),
|
||||
'reloc_missing': sorted((tr - orr).elements())[:8], 'reloc_extra': sorted((orr - tr).elements())[:8]}
|
||||
elif t and not o:
|
||||
cls = 'UNWRITTEN'
|
||||
p = parks.get((unit, name))
|
||||
fns.append({'name': name, 'size': size, 'class': cls, **info, 'park': p['class'] if p else None,
|
||||
'park_evidence': (p or {}).get('evidence', '')[:400]})
|
||||
out[unit] = {'tier': row['tier'], 'exact': row['exact'], 'fn': row['fn'], 'gap_bytes': row['gap_bytes'],
|
||||
'data_gap': row['data_gap'], 'missing': fns, 'rejections': rej.get(unit, []),
|
||||
'audit': row.get('audit'), 'audit_fail_lines': row.get('audit_fail_lines', []),
|
||||
'link_fail': row.get('link_fail', []), 'surplus_different': row.get('surplus_different', []),
|
||||
'ledgers': [l for l in logs if l.startswith(base + '_') or l.startswith(base + '.')],
|
||||
'round1_results': [f for f in r1 if ('_' + base + '_') in f.replace('/', '_') or f.endswith('_' + base + '.md')],
|
||||
'claim': row.get('claim')}
|
||||
json.dump(out, open('scratch/campaign/hints.json', 'w'), indent=1)
|
||||
print(len(out), 'units;', collections.Counter(f['class'] for u in out.values() for f in u['missing']))
|
||||
@@ -0,0 +1,13 @@
|
||||
"""Patch build.ninja's cl rule to the absolute backslash CL path (run after every configure)."""
|
||||
import os
|
||||
|
||||
BS = chr(92)
|
||||
root = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
||||
cl = BS.join([root.replace('/', BS), 'xbox', 'bin', 'vc7', 'CL.Exe'])
|
||||
p = os.path.join(root, 'build.ninja')
|
||||
s = open(p).read()
|
||||
old = 'command = xbox/bin/vc7/CL.Exe'
|
||||
n = s.count(old)
|
||||
s = s.replace(old, 'command = ' + cl)
|
||||
open(p, 'w').write(s)
|
||||
print('patched', n, cl)
|
||||
@@ -0,0 +1,84 @@
|
||||
"""Re-baseline named stale parks to the current build's base measurements (textual, in place).
|
||||
|
||||
python scratch/campaign/rebaseline_parks.py "<unit>::<function>" [...] [--note "text"]
|
||||
|
||||
Runs tools.parked_functions validation against build/report.json, and for each NAMED key that is
|
||||
stale only in its base block / objdiff_percent (never target), rewrites those lines in
|
||||
config/parked.json. With --note, appends the sentence to that entry's evidence string.
|
||||
Any other stale or invalid entry is reported and left alone.
|
||||
"""
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parents[2]))
|
||||
from tools.parked_functions import validate_parked_functions # noqa: E402
|
||||
|
||||
root = Path(__file__).resolve().parents[2]
|
||||
args = sys.argv[1:]
|
||||
note = None
|
||||
if '--note' in args:
|
||||
i = args.index('--note')
|
||||
note = args[i + 1]
|
||||
del args[i:i + 2]
|
||||
wanted = set(args)
|
||||
|
||||
res = validate_parked_functions(root, root / 'build' / 'report.json', root / 'objdiff.json',
|
||||
root / 'config' / 'parked.json')
|
||||
path = root / 'config' / 'parked.json'
|
||||
raw = path.read_bytes().decode('utf-8')
|
||||
nl = '\r\n' if '\r\n' in raw else '\n'
|
||||
lines = raw.split(nl)
|
||||
done = []
|
||||
for item in res['stale']:
|
||||
key = '%s::%s' % (item['unit'], item['function'])
|
||||
if key not in wanted:
|
||||
print('stale (not named, left alone):', key, item.get('differences'))
|
||||
continue
|
||||
if any(d['measurement'].startswith('target') for d in item['differences']):
|
||||
sys.exit('ABORT: target measurement changed for ' + key)
|
||||
fn_pat = '"function": %s,' % json.dumps(item['function'])
|
||||
unit_pat = '"unit": %s,' % json.dumps(item['unit'])
|
||||
hits = [k for k, l in enumerate(lines) if l.strip() == fn_pat and lines[k - 1].strip() == unit_pat]
|
||||
if len(hits) != 1:
|
||||
sys.exit('ABORT: %d entry matches for %s' % (len(hits), key))
|
||||
k = hits[0]
|
||||
cur = item['measurements']
|
||||
end = k
|
||||
depth = 1 # entry '{' opened on line k-2
|
||||
for j in range(k, len(lines)):
|
||||
depth += lines[j].count('{') - lines[j].count('}')
|
||||
if depth <= 0:
|
||||
end = j
|
||||
break
|
||||
span = range(k, end + 1)
|
||||
b = next(j for j in span if lines[j].strip().startswith('"base":'))
|
||||
if lines[b].strip() == '"base": {':
|
||||
for j, field in ((b + 1, 'size'), (b + 2, 'relocation_count'), (b + 3, 'normalized_sha256')):
|
||||
m = re.match(r'^(\s*"%s": )(.*?)(,?)$' % field, lines[j])
|
||||
if not m:
|
||||
sys.exit('ABORT: layout of %s near line %d' % (key, j + 1))
|
||||
lines[j] = m.group(1) + json.dumps(cur['base'][field]) + m.group(3)
|
||||
else:
|
||||
m = re.match(r'^(\s*"base": )\{.*\}(,?)$', lines[b])
|
||||
if not m:
|
||||
sys.exit('ABORT: compact layout of %s near line %d' % (key, b + 1))
|
||||
lines[b] = m.group(1) + '{ "size": %d, "relocation_count": %d, "normalized_sha256": %s }' % (
|
||||
cur['base']['size'], cur['base']['relocation_count'], json.dumps(cur['base']['normalized_sha256'])) + m.group(2)
|
||||
o = next(j for j in span if lines[j].strip().startswith('"objdiff_percent":'))
|
||||
m = re.match(r'^(\s*"objdiff_percent": )(.*?)(,?)$', lines[o])
|
||||
lines[o] = m.group(1) + json.dumps(cur['objdiff_percent']) + m.group(3)
|
||||
if note:
|
||||
e = next(j for j in span if lines[j].strip().startswith('"evidence":'))
|
||||
m = re.match(r'^(\s*"evidence": ")(.*)(",?)$', lines[e])
|
||||
lines[e] = m.group(1) + m.group(2) + ' ' + json.dumps(note)[1:-1] + m.group(3)
|
||||
done.append(key)
|
||||
print('rebaselined', key, cur['base'], cur['objdiff_percent'])
|
||||
missing = wanted - set(done)
|
||||
if missing:
|
||||
print('named but not stale (unchanged):', sorted(missing))
|
||||
path.write_bytes(nl.join(lines).encode('utf-8'))
|
||||
json.loads(path.read_text(encoding='utf-8'))
|
||||
for inv in res['invalid']:
|
||||
print('invalid (left alone):', inv)
|
||||
@@ -0,0 +1,56 @@
|
||||
"""In-place config/symbols.json line surgery (never re-serialises; preserves order and CRLF).
|
||||
|
||||
python scratch/campaign/sym_edit.py ops.json [--dry]
|
||||
|
||||
ops.json: list of operations, each keyed by the exact file_offset and current name:
|
||||
{"op": "static", "file_offset": 75280, "name": "_foo"} -> add "static": true
|
||||
{"op": "unstatic", "file_offset": 518208, "name": "_foo"} -> remove "static": true
|
||||
{"op": "rename", "file_offset": 2600880, "name": "_old", "new": "_new"}
|
||||
{"op": "insert_after", "file_offset": 2600880, "name": "_anchor", "line": "{ ... },"}
|
||||
Each op must match exactly one line (file_offset AND name) or the script aborts.
|
||||
"""
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
|
||||
ops = json.load(open(sys.argv[1]))
|
||||
dry = '--dry' in sys.argv
|
||||
p = 'config/symbols.json'
|
||||
raw = open(p, 'rb').read().decode('utf-8')
|
||||
crlf = '\r\n' in raw
|
||||
lines = raw.split('\r\n' if crlf else '\n')
|
||||
|
||||
|
||||
def find(off, name):
|
||||
pat = re.compile(r'"file_offset": %d, "flags": \d+, "name": "%s"' % (off, re.escape(name)))
|
||||
hits = [i for i, l in enumerate(lines) if pat.search(l)]
|
||||
if len(hits) != 1:
|
||||
sys.exit('ABORT: %d matches for %s @%d' % (len(hits), name, off))
|
||||
return hits[0]
|
||||
|
||||
|
||||
inserts = []
|
||||
for op in ops:
|
||||
i = find(op['file_offset'], op['name'])
|
||||
line = lines[i]
|
||||
if op['op'] == 'static':
|
||||
if '"static": true' in line:
|
||||
print('already static', op['name'])
|
||||
continue
|
||||
lines[i] = re.sub(r'\s*\}(,?)\s*$', r', "static": true }\1', line)
|
||||
elif op['op'] == 'unstatic':
|
||||
lines[i] = line.replace(', "static": true', '')
|
||||
elif op['op'] == 'rename':
|
||||
lines[i] = line.replace('"name": "%s"' % op['name'], '"name": "%s"' % op['new'])
|
||||
elif op['op'] == 'insert_after':
|
||||
lines.insert(i + 1, op['line'])
|
||||
print('inserted after %s: %s' % (op['name'], op['line']))
|
||||
continue
|
||||
else:
|
||||
sys.exit('unknown op ' + op['op'])
|
||||
print('%-12s %s -> %s' % (op['op'], line.strip(), lines[i].strip()))
|
||||
for i, l in sorted(inserts, reverse=True):
|
||||
lines.insert(i + 1, l)
|
||||
print('inserted after line %d: %s' % (i + 1, l))
|
||||
if not dry:
|
||||
open(p, 'wb').write(('\r\n' if crlf else '\n').join(lines).encode('utf-8'))
|
||||
@@ -0,0 +1,68 @@
|
||||
"""Derive sym_edit.py ops from a worker's edited symbols.json copy vs HEAD's config/symbols.json.
|
||||
|
||||
python scratch/campaign/sym_ops_from_copy.py <worker_symbols.json> <out_ops.json> [<base-ref>]
|
||||
The worker copy is diffed against <base-ref>:config/symbols.json (default HEAD); use the commit the
|
||||
worker started from so later integrated edits are not read as reversions.
|
||||
Handles in-place static add/remove, renames at the same file_offset, and inserted lines.
|
||||
"""
|
||||
import difflib
|
||||
import json
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
base = subprocess.run(['git', 'show', (sys.argv[3] if len(sys.argv) > 3 else 'HEAD') + ':config/symbols.json'], capture_output=True, text=True, encoding='utf-8').stdout
|
||||
base = base.replace('\r\n', '\n').split('\n')
|
||||
new = open(sys.argv[1], 'rb').read().decode('utf-8').replace('\r\n', '\n').split('\n')
|
||||
R = re.compile(r'"file_offset": (\d+), "flags": \d+, "name": "([^"]+)"')
|
||||
ops = []
|
||||
sm = difflib.SequenceMatcher(a=base, b=new, autojunk=False)
|
||||
for tag, i1, i2, j1, j2 in sm.get_opcodes():
|
||||
if tag == 'equal':
|
||||
continue
|
||||
if tag == 'replace' and (i2 - i1) == (j2 - j1):
|
||||
for a, b in zip(base[i1:i2], new[j1:j2]):
|
||||
ma, mb = R.search(a), R.search(b)
|
||||
assert ma and mb and ma.group(1) == mb.group(1), (a, b)
|
||||
off, name = int(ma.group(1)), ma.group(2)
|
||||
if ma.group(2) != mb.group(2):
|
||||
ops.append({'op': 'rename', 'file_offset': off, 'name': name, 'new': mb.group(2)})
|
||||
name = mb.group(2)
|
||||
sa, sb = '"static": true' in a, '"static": true' in b
|
||||
if sb and not sa:
|
||||
ops.append({'op': 'static', 'file_offset': off, 'name': name})
|
||||
elif sa and not sb:
|
||||
ops.append({'op': 'unstatic', 'file_offset': off, 'name': name})
|
||||
elif tag == 'insert':
|
||||
anchor = R.search(base[i1 - 1])
|
||||
prev = (int(anchor.group(1)), anchor.group(2))
|
||||
# anchor must reference the (possibly renamed) previous line in new
|
||||
pm = R.search(new[j1 - 1])
|
||||
for k, l in enumerate(new[j1:j2]):
|
||||
ops.append({'op': 'insert_after', 'file_offset': int(pm.group(1)), 'name': pm.group(2), 'line': l.strip()})
|
||||
pm = R.search(l)
|
||||
elif tag == 'replace':
|
||||
# mixed: pair the common prefix, insert the rest
|
||||
n = min(i2 - i1, j2 - j1)
|
||||
for a, b in zip(base[i1:i1 + n], new[j1:j1 + n]):
|
||||
ma, mb = R.search(a), R.search(b)
|
||||
assert ma and mb and ma.group(1) == mb.group(1), (a, b)
|
||||
off, name = int(ma.group(1)), ma.group(2)
|
||||
if ma.group(2) != mb.group(2):
|
||||
ops.append({'op': 'rename', 'file_offset': off, 'name': name, 'new': mb.group(2)})
|
||||
name = mb.group(2)
|
||||
if '"static": true' in b and '"static": true' not in a:
|
||||
ops.append({'op': 'static', 'file_offset': off, 'name': name})
|
||||
elif '"static": true' in a and '"static": true' not in b:
|
||||
ops.append({'op': 'unstatic', 'file_offset': off, 'name': name})
|
||||
assert (i2 - i1) <= (j2 - j1), 'deletions unsupported'
|
||||
pm = R.search(new[j1 + n - 1])
|
||||
for l in new[j1 + n:j2]:
|
||||
ops.append({'op': 'insert_after', 'file_offset': int(pm.group(1)), 'name': pm.group(2), 'line': l.strip()})
|
||||
pm = R.search(l)
|
||||
else:
|
||||
raise SystemExit('unsupported opcode %s at %d' % (tag, i1))
|
||||
json.dump(ops, open(sys.argv[2], 'w'), indent=1)
|
||||
print(len(ops), 'ops')
|
||||
for o in ops:
|
||||
print(o)
|
||||
@@ -0,0 +1,45 @@
|
||||
# REVIEW source/ai/actors
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/review_r2_actors/amended/actors_admission_combined.patch (sha1 096b9dff; the pass-1 reviewer wrote it, and I verified it with cmp and git apply --check). It is identical to applying the primary set scratch/w/actors/actors_final.patch (691e8fbc) + parked_retire.patch (7e937267) + config_status.patch (0e7d18f0) with no changes, so no amendment is needed.
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/ai/actors",
|
||||
"approve": true,
|
||||
"issues": "Nothing blocks approval. gate gives 76/76 EXACT and object_audit passes (137/0). The only new surplus is _add_vectors3d and _point_from_line3d, each byte-identical to January's selected copy (ANY, no NODUP), and provider_link passes in both orders. PDB storage shows 0 disagreements, data is identical to production and 100%, casts are strip-inert, and there are 0 fake-match leads. Notes: apply the CRLF patches to the working tree, not with --cached. input_update exactness rests on the complete /Od declared-local set (8 unlocalised later-source lines of assert drift remain as disclosed residual risk). January's spawn has a latent actor_get(unit.actor_index) after the ternary, which production already reproduces. Re-run provider_link if the reserved actor_combat packet changes its _add_vectors3d emission."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
All checks were re-run independently at HEAD b7c1b7d9 (canonical f6d00a8c plus one docs file; source/, config/ and tools/ are unchanged). The tree stayed clean. Evidence is in C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/review_r2_actors/ (LEDGER.md second-pass section, REVIEW_pass2.md, and an addendum appended to REVIEW.md).
|
||||
(1) git apply --check passes for actors_final.patch, parked_retire.patch and config_status.patch, alone and together, on the working tree. The three patches, applied with patch -p1 to worktree copies in tree2/, give an actors.c byte-identical to final.c (sha1 d9dc3764).
|
||||
(2) gate.py --source tree2/.../actors.c --all --out rv.obj gives `== exact 76 residual 0 unwritten 0`: _actors_spawn_from_unit is EXACT at 672 and _actor_input_update is EXACT at 2384. A gate compile of the HEAD source is section-identical to build/base (181/181), so gate matches ninja for this unit. rv.obj and the worker's final.obj are section-identical (183/183). rv.obj against production differs only in those 2 functions plus 2 new COMDATs; every data section and .drectve is identical.
|
||||
(3) object_audit rv.obj: PASS, 137 January symbols, 0 differ. The surplus delta against production is exactly +_add_vectors3d (48 B) and +_point_from_line3d (48 B).
|
||||
(4) The surplus_identity logic run on rv.obj: 18 candidate-only code COMDATs, 0 differ. _point_from_line3d matches the action_charge copy and _add_vectors3d matches the actor_combat copy. Both use selection ANY, and January's actors.obj references neither, which is the all-inlined class. nodup_census: 24 and 17 definers, no NODUP. The class is already landed in Matching objects: actor_firing_position, actor_type_infection, path, render_sky, leaf_map and biped_limp_noodle for pfl3d, and device_machines for add_vectors3d.
|
||||
(5) provider_link --baseline=build/base actors.obj: both new symbols PASS in both orders. The full run is 46 PASS, 0 FAIL.
|
||||
(6) The pdb_storage logic on rv.obj against cachebeta_publics: 137 symbols, 0 disagreements.
|
||||
(7) /W3 /Zs: 6 C4244 warnings, all on pre-existing lines (production has 7). No C4013 or C4133.
|
||||
(8) STRIP TEST: removing all three (real_vector3d *) casts in add_vectors3d and both typed-view casts leaves input_update EXACT, so every cast is byte-inert.
|
||||
(9) fake_match_scan on the patched actors.c: 0 leads.
|
||||
(10) objdiff 3.3.1 on a mini-project scores the candidate 75/76 raw. Code is 18686 of 19130 (+3048 over production's 15638) and data is 2288/2288. The only row under 100% is the pre-existing _actor_handle_unit_effect at 96.8. build/semantic_report.json accepted_ledger credits it (semantic-coff) before revoke_incomplete_units runs (checked in project_x86.py and audit_object_admission.py), so the Matching label holds without a semantic_matches entry.
|
||||
(11) parked.json loses only the 2 actors entries (86 to 84), the version is unchanged and the JSON is valid. config.json is a one-line NonMatching-to-Matching change and is valid. There are no actors rejections in object_admission_rejections or semantic_credit_rejections.
|
||||
(12) Every changed construct was re-read against the /Od readout of 0x4486c0 and 0x44dfe0; I regenerated the readouts and they are identical to the worker's. The swarm arm is a direct static call to 0x44bb30, then add_vectors3d, with a short counter. The tail is if/else with a single exit. The parent is taken with object_get (push -1) into -0x24, with a pure-copy view at -0x3c. The gunner store precedes the call whose result goes to -0x44. The != arm comes first. The prevehicle encounter is at -0x58. The stored flag is read after the 4 stores. The mismatch flag is at -0x61, with stores at 0x448da3 and 0x448dc6 and a jmp over the else-if. The threat loop is object_get into -0x6c with a view at -0x70 and two stores. normalize3d is a separate statement. In spawn, the ternary temp at -0xe8 goes to -0x10; there are 3 real_random_range calls, a real call to point_from_line3d at 0x42e0d0, a word counter, and the SD1 declaration order. The full named-local inventory equals final.c's declaration order.
|
||||
(13) I checked the rewrites for semantic equivalence and house rules. Two hand expansions are removed. There is no new prototype, header, flag or symbols.json change. Names are descriptive and follow codebase convention. The removed macros were TU-local.
|
||||
(14) Assert-anchor drift, from odbuild file and the HCEX line table: +13 at January 2733 and +21 at 3313-3436.
|
||||
(15) The pass-1 reviewer's amended/actors_admission_combined.patch (096b9dff) is the exact concatenation of the three primary patches, and git apply --check passes on it.
|
||||
|
||||
## issues
|
||||
Nothing blocks approval.
|
||||
|
||||
Integrator notes:
|
||||
(a) The patch content lines are CRLF. Apply them with plain `git apply` to the CRLF working tree; `git apply --cached/--index` fails against the LF index.
|
||||
(b) input_update exactness depends on the declared-local set, through the x87 phase at cross_product3d site 2. final.c uses the complete /Od named-local inventory with no selection among features. r2w1b found a different exact subset, but it contradicts /Od in several places (long counter, no firing-variant local, no parent view, keeps the alias), so final.c is the principled landing. Residual authenticity risk: assert-anchor drift is +13 at January 2733 (actor_general_update) and +21 at 3313 (input_update). The HCEX line table cannot place the 8 later-source lines in between, so some may be inside input_update. This is disclosed and acceptable under the /Od evidence standard.
|
||||
(c) In spawn, January's bytes (0x35-0x5c) compute the swarm/actor ternary but then reload unit.actor_index for actor_get. Swarm members have actor_index NONE (asserts 1301/1302/870/871), so a swarm-member source would call actor_get(NONE). This is a latent January defect, and production's OR-chain behaves the same way, so the patch adds no new behaviour. The owner may want a BUG comment.
|
||||
(d) _add_vectors3d's January provider is actor_combat, which is RESERVED for the Codex packet. Re-run provider_link for actors if that packet changes actor_combat's COMDAT emission.
|
||||
(e) Run the full ninja build and stable diff. No header is touched, so only actors.obj can change. Do not gate actors with --forbid-emitted-symbol _point_from_line3d.
|
||||
(f) r2w1b_actors_c_v2.patch is superseded. It differs only by a byte-inert declaration order that contradicts /Od.
|
||||
(g) The MANIFEST says HEAD b7c1b7d9 touches only scratch files. It actually adds one docs file, but source/, config/ and tools/ are unchanged, so the patches are unaffected.
|
||||
(h) Incident: two reviewers worked in this slug at the same time. My odproj/ run at 09:02 overwrote the files pass 1's mkodproj.py had written to the same directory. Both runs give the same numbers. No tracked file was touched.
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
# REVIEW source/cache/xbox_texture_cache
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_xbox_texture_cache\combined_amended.patch
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/cache/xbox_texture_cache",
|
||||
"approve": true,
|
||||
"issues": "Approve only with the amendment: combined_amended.patch, or 01-04 plus 05_remove_invented_pad_member.patch. It removes the invented `byte reserved006[2]` pad from xbox_texture_cache_texture. HCEX texture_datum has no pad, and brief section 9 makes a pad member in a TU-private struct an admission blocker. The removal is byte-inert: 25/25 EXACT, object canonically identical, object_audit PASS against the emulated split, pdb_storage 0, surplus IDENTICAL, provider_link PASS. 06 (page-protection constants) is optional."
|
||||
},
|
||||
{
|
||||
"unit": "source/bitmaps/bitmap_group.h consumers (bink_playback, bitmaps + 44 others)",
|
||||
"approve": true,
|
||||
"issues": "The HCEX field correction is exact. All 46 consumers are byte-identical in the 612-TU sweep, and no park moves."
|
||||
},
|
||||
{
|
||||
"unit": "source/cache/texture_cache.h (+render_debug.c include) and new source/cache/xbox_texture_cache.h",
|
||||
"approve": true,
|
||||
"issues": "texture_cache.h gets the debug_render prototype only. The mappers go in a focused owner header (precedent: real_math_planes.h). The 3-prototype form's regression of decals and hud_weapon was reproduced. All 15 consumers are identical. render_debug loses its C4013. The packet composes cleanly with the pending owner-queue render_debug and object_lights packets."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
Everything ran independently in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_xbox_texture_cache (REVIEW.md, LEDGER.md P0-P15). HEAD is b7c1b7d9, whose source equals f6d00a8c. git status stayed clean throughout.
|
||||
|
||||
(1) Patches:
|
||||
- git apply --check at HEAD: combined, 01 and 04 exit 0. 02 and 03 fail on their own by design because they depend on 01.
|
||||
- Applying 01->04 in sequence gives the same result as combined. That result matches the worker's sF tree and cand_P3.c after LF normalisation.
|
||||
- My symbols.json equals patches/symbols.json byte for byte. It differs from config only on rows 7239, 7242-7245 and 7250.
|
||||
|
||||
(2) Names, checked by script:
|
||||
- The Sept-2001 map in atlas 7eacac85 lists 21 xbox_texture_cache.obj names. The worker said 22; it is 21, plus 4 unlisted XDK wrappers, for 25. All 21 land on the patched symbols.json names at a constant delta of 0xE900.
|
||||
- January's own atlas 4cc87b45 (exact tier) has 12 names, including _compare at 0x5ae7b0. All match.
|
||||
|
||||
(3) HCEX: I re-ran DIA2Dump on bitmap_data. It matches the patched bitmap_group.h exactly: mipmap_pad, pixels_offset, pixels_size, tag_index, cache_block_index.
|
||||
|
||||
(4) Emulated split: I made my own config copy and ran csplit (rc 0). diff -rq against build/split shows only xbox_texture_cache.obj differs.
|
||||
|
||||
(5) gate.py, run literally in a gate root (copies of build.ninja, tools, the candidate source tree, xbox/include and the emu split object), with --source source/cache/xbox_texture_cache.c --all --forbid-emitted-symbol _point_from_line3d:
|
||||
- The guard passed. Result: exact 25, residual 0, unwritten 0.
|
||||
- The per-function table shows storage equal on all 25; the XDK wrappers are now 3/3.
|
||||
|
||||
(6) Unmodified copies of scratch/tools scripts against the emu split:
|
||||
- object_audit PASS: 42 January-owned sections ok and 46/46 symbols. Surplus is unchanged. The 3 XDK tables are also surplus in 64 objects that are already Matching.
|
||||
- pdb_storage: 0 disagreements. Production has 3, all XDK wrappers.
|
||||
- surplus_identity: 2 COMDATs IDENTICAL.
|
||||
- provider_link: PASS on 19 rows in both orders.
|
||||
- report.json: code 3457/3457 and data 6344/6344.
|
||||
|
||||
(7) Symbol census over split, base and candidate: no other object defines or references any renamed or storage-flipped name.
|
||||
|
||||
(8) Shadow sweep (my own rsweep.py, all 612 TUs):
|
||||
- The control tree is 612/612 identical to build/base.
|
||||
- Candidate vs control: 611 identical. Only xbox_texture_cache differs, through the renamed symbols.
|
||||
- Consumer lists from /showIncludes match the worker's: texture_cache.h goes from 14 to 15 consumers, bitmap_group.h from 45 to 46, and the new header has 1.
|
||||
- I reproduced the lab that puts all three prototypes in texture_cache.h. It changes decals (.text 400) and hud_weapon (.text 2624). The debug_render-only form is identical.
|
||||
- The pending owner-queue packets (render_debug 05+06, object_lights 01+07) were applied to both sides. The amended packet still changes only xbox_texture_cache across all 612 TUs.
|
||||
|
||||
(9) CL /Zs /W3 warnings are identical, except that render_debug loses the C4013 for texture_cache_debug_render.
|
||||
|
||||
(10) Strip tests on pre-existing constructs:
|
||||
- The bitmap_group named local, when inlined, stays EXACT.
|
||||
- The point->vector casts in render_inverse_transform_screen_point, when removed, stay EXACT (the helper and debug_render). They are type-only; the construct is canonical Wave 12, commit 336fecdb.
|
||||
|
||||
(11) Amendments:
|
||||
- A (remove the pad member) and B (page-protection constants) each give 25/25 EXACT.
|
||||
- Both are canonically identical to the worker's candidate object in every section, relocation and symbol-table entry.
|
||||
- The amended object passes object_audit and provider_link.
|
||||
- combined_amended.patch: git apply --check exits 0 at HEAD. Applied, it reproduces the tested tree. 05 applied after 01-04 gives the same tree.
|
||||
|
||||
## issues
|
||||
APPROVED ONLY WITH THE AMENDMENT. The packet is not admissible as submitted.
|
||||
|
||||
BLOCKER B1 (fixed in amended_patch): the TU-private struct xbox_texture_cache_texture keeps an invented pad member, `byte reserved006[2];`, between `boolean used` (offset 5) and `struct bitmap_data *bitmap` (offset 8).
|
||||
- The HCEX analogue texture_datum (identifier, request_index, available@4, postprocessed@5, bitmap@8, texture@0xC) has no pad.
|
||||
- Natural alignment already puts bitmap at 8.
|
||||
- Brief section 9 lists pad members in a TU-private struct as an admission blocker even when bytes match.
|
||||
- Round 1 removed this same class (player_profile byte pad[3], game_engine netgame_goal pads).
|
||||
- The line predates this packet, but OBJECT_COMPLETE admits the whole TU.
|
||||
- Removing it is byte-inert: 25/25 EXACT, and the object is canonically identical to the candidate, so object_audit and provider_link PASS.
|
||||
|
||||
INTEGRATION: apply combined_amended.patch, or the worker's 01..04 followed by scratch/w/review_r2_xbox_texture_cache/05_remove_invented_pad_member.patch. Add the new file source/cache/xbox_texture_cache.h. Regenerate the split with csplit before gating.
|
||||
|
||||
NON-BLOCKING:
|
||||
(1) Optional 06_optional_page_protection_constants.patch changes XBOX_TEXTURE_CACHE_PROTECTION=0x404 to PAGE_READWRITE | PAGE_WRITECOMBINE. That is the XDK spelling physical_memory_map.c uses for the same memory. It is byte-identical.
|
||||
(2) The TU-local bitmap enums remain. Canon now accepts them: bitmaps.c and bitmap_utilities.c were admitted Matching on 2026-09-23 and bitmap_extract.c on 2026-09-20, all with the same copies. The 20260904 veto predates that.
|
||||
(3) TU-private type and field names differ from HCEX (texture_datum / texture_cache_debug_options_definition). This is an owner preference only.
|
||||
(4) bitmap_d3d_format_tables[2][18] is a descriptive, pre-existing interpretation.
|
||||
(5) A name-keyed stable sweep will show the 3 renames as 3 losses and 3 gains, because scratch/campaign/gate_baseline has the old names.
|
||||
(6) Re-sweep after composing with other round-2 header packets. The decals and hud_weapon sentinels are one declaration away.
|
||||
(7) Manifest erratum: the Sept map lists 21 xbox_texture_cache names, not 22.
|
||||
@@ -0,0 +1,111 @@
|
||||
# REVIEW source/hs/hs_runtime
|
||||
|
||||
approve: False
|
||||
|
||||
amended_patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime\amended\production_amended.patch (LF, apply with git apply against the index). CRLF working-tree variant: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime\amended\production_amended_crlf.patch. Land it with the worker's C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime__render_debug_trigger_volumes\park_retire.patch (unchanged). Fallback: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime\amended\production_matrix_only.patch (plus its _crlf variant).
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/hs/hs_runtime",
|
||||
"approve": false,
|
||||
"issues": "F1: the submitted grouping contradicts the /Od declaration order. matrix is declared in the loop block after volume_index/scenario, and center/ray/result are declared before sides/side/axis/color. Fixed by amended/production_amended.patch: matrix first in the if-block, plus a { center; ray; result; } block after the edge loop, which the escape law permits. The amended patch gives an identical object and passes every check: gate 65/1/0; object_audit FAIL(1), begin_random only, when composed with the storage patch; surplus IDENTICAL; provider_link PASS both orders; 0 regressions. park_retire.patch is approved as is. The object stays blocked by the retired _hs_evaluate_begin_random tie."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
Environment: HEAD b7c1b7d9 (source, config and tools equal f6d00a8c); tree clean before and after the review. All evidence is in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime\ (LEDGER.md, REVIEW.md).
|
||||
|
||||
Patch application:
|
||||
- git apply --check is OK at HEAD for production.patch, production_crlf.patch, park_retire.patch, park_retire_crlf.patch, the storage patch and my 4 amended/fallback patches.
|
||||
- GNU patch on the LF HEAD blob and git apply --directory on CRLF copies both rebuild the worker's cand.c and compose_mine_first file byte for byte.
|
||||
- The worker and storage patches give identical results in either order (AB==BA). No mixed line endings.
|
||||
|
||||
gate.py --all (only residual in every candidate is _hs_evaluate_begin_random [sha]):
|
||||
- base: 64/2/0
|
||||
- worker patch alone: 65/1/0
|
||||
- worker + storage: 65/1/0
|
||||
- amended alone and amended + storage: 65/1/0
|
||||
- _render_debug_trigger_volumes is EXACT 1088 in all candidates.
|
||||
|
||||
Per-section sweep over the 127 January-owned sections:
|
||||
- gain 1, regression 0, changed 1.
|
||||
- My base.obj is identical to build/base production.
|
||||
|
||||
object_audit:
|
||||
- worker alone: FAIL(13) = begin_random + 12 pre-existing converter storage rows.
|
||||
- composed (worker or amended): FAIL(1), begin_random only; 129/129 symbols match; all 61 data sections ok.
|
||||
- only new surplus: .text _point_from_line3d.
|
||||
|
||||
pdb_storage logic against cachebeta publics:
|
||||
- composed: 0 disagreements.
|
||||
- _point_from_line3d is public (line 6312) and is emitted as an external SELECT_ANY COMDAT.
|
||||
|
||||
surplus_identity logic on the candidate objects:
|
||||
- 5/5 IDENTICAL.
|
||||
- _point_from_line3d is 48/0/9b763841f8519177, equal to January's action_charge copy.
|
||||
|
||||
provider_link:
|
||||
- --baseline: PASS in both orders.
|
||||
- full run on the composed/amended objects: PASS.
|
||||
- full run on the worker object alone fails only the 12 converter rows (no January provider).
|
||||
- nodup_census: 24 definers, 0 NODUP.
|
||||
|
||||
tinfo --data: base and amended are identical apart from .debug$S. No data change.
|
||||
|
||||
/Zs /W3: the warning set equals HEAD's. A sanity lab with an unused local proves C4101 is detected; gate --cflag /W3 /WX turned out not to be a valid warning test.
|
||||
|
||||
park_retire: parked entries go from 86 to 85; only the trigger_volumes entry is removed; the JSON is valid.
|
||||
|
||||
/Od and PDB evidence:
|
||||
- Re-read with od_linear 0x606c80..0x607470; parsed the RTC descriptor at 0x607464.
|
||||
- Floats: 1.0, -1.0, 0.5, 0.15, 0.95.
|
||||
- 8 point_from_line3d calls, and every argument push matches the candidate.
|
||||
- HCEX_Release.pdb locals via DIA2Dump: matrix, local_extent, world_extent, sides[2], result, ray. HCEX.pdb has no record for this function.
|
||||
|
||||
Strip tests (lab):
|
||||
- ternary string call: RESIDUAL
|
||||
- single hoisted tail: RESIDUAL
|
||||
- Both duplicated constructs are load-bearing and attested by /Od.
|
||||
|
||||
Other checks:
|
||||
- Re-checked the placement of matrix in each of the worker's 8 order variants.
|
||||
- January relocations confirm that collision_test_vector and render_debug_string_at_point are out-of-line calls (the escape law applies).
|
||||
- begin_random retirement confirmed from its park and the w1/w3c ledgers.
|
||||
- Claimed hs_runtime while building the amended patch, then released it.
|
||||
|
||||
## issues
|
||||
F1 (blocking, fixable): the declaration grouping in production.patch contradicts the /Od declaration order.
|
||||
|
||||
What the /Od frame shows:
|
||||
- The frame follows declaration order, not first-use order:
|
||||
- scenario is stored first but sits below volume_index;
|
||||
- matrix is used first late but holds the topmost slot, -0x40.
|
||||
- /Od order: matrix, volume_index, scenario, volume, local_extent, world_extent, edge_index, corner, sides, side, axis, color, center, ray, result.
|
||||
|
||||
Where the submitted source differs:
|
||||
1. It declares matrix in the volume-loop block, after `short volume_index; struct scenario *scenario`.
|
||||
2. It declares center, ray and result before the edge-loop locals.
|
||||
|
||||
Why this blocks:
|
||||
- None of the worker's 8 order variants puts matrix before volume_index; bareblock also keeps matrix in the loop. So the MANIFEST claim that the full /Od order was measured is inaccurate.
|
||||
- Brief section 9 and the wave-2 light_volumes precedent reject a grouping that contradicts the /Od order when an equally exact, /Od-consistent grouping exists.
|
||||
|
||||
Amended patch:
|
||||
- Declares `real_matrix4x3 matrix;` first in the if-block.
|
||||
- Puts center, ray and result in their own block after the edge loop. The escape law permits this: their addresses reach the REL32 out-of-line calls _collision_test_vector and _render_debug_string_at_point. C89 needs the block, and the block is byte-inert. HCEX_Release corroborates it: matrix comes first there, and ray/result come after sides.
|
||||
- Result: 65/1/0, and the object is identical to the worker's candidate (154/154 non-debug sections, 488/488 symbols, including $L numbering). Every exactness and admission result carries over.
|
||||
- My amended source is textually identical to the parallel function reviewer's amended file.
|
||||
- Fallback if the owner rejects the block: amended/production_matrix_only.patch (also exact, identical object).
|
||||
|
||||
Everything else verifies, so the verdict class FUNCTIONS_EXACT_OBJECT_BLOCKED is correct:
|
||||
- The function is strictly exact.
|
||||
- The object is blocked only by the retired begin_random tie. The 12 storage rows are fixed by the separate storage patch, which composes in either order.
|
||||
- The ruling-5 COMDAT conditions hold at unit level.
|
||||
- park_retire.patch is approved unchanged.
|
||||
|
||||
Integrator steps:
|
||||
- Land the amended patch together with park_retire.patch.
|
||||
- Run the full ninja build and the stable sweep; ruling 5 requires the full build sweep.
|
||||
- After the reserved Codex real_math packet lands, re-gate hs_runtime and re-run surplus identity and provider_link.
|
||||
- The object stays NonMatching. Credit: 1 function, 1,088 padded bytes. The COMDAT gets zero credit.
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
# REVIEW source/hs/hs_runtime::_render_debug_trigger_volumes (1088 B)
|
||||
|
||||
approve: False
|
||||
|
||||
amended_patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime__render_debug_trigger_volumes\amended\production_amended.patch
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/hs/hs_runtime",
|
||||
"approve": false,
|
||||
"issues": "Function-level landing: reject production.patch as submitted and land amended/production_amended.patch (or production_amended_crlf.patch) with the worker's park_retire.patch. Reason: the submitted grouping declares matrix after volume_index/scenario and center/ray/result before the edge-loop locals, which contradicts the /Od declaration order. The amended order is matrix, volume_index, scenario, volume, local_extent, world_extent, edge_index, corner, sides, side, axis, color, center, ray, result, with an escape-law block for center/ray/result. It is EXACT and gives an identical object. Fallback without the block: fallback/production_matrix_only.patch, also identical. Object admission stays blocked by the _hs_evaluate_begin_random tie; storage is handled by the separate converter patch, which composes cleanly (object_audit FAIL(1), begin_random only)."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
I re-ran every check independently. Evidence is in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime__render_debug_trigger_volumes\ (REVIEW.md, LEDGER.md).
|
||||
(1) Patches:
|
||||
- `git apply --check` is clean at worktree HEAD b7c1b7d9 (source/config/tools equal to f6d00a8c) for production.patch, production_crlf.patch, park_retire.patch and park_retire_crlf.patch.
|
||||
- GNU patch on the f6d00a8c blob reproduces cand.c byte for byte.
|
||||
- The CRLF patch needs `patch --binary` under GNU patch; git apply is unaffected.
|
||||
(2) gate.py --all on the applied file: 65 exact / 1 residual (_hs_evaluate_begin_random [sha]) / 0 unwritten. _render_debug_trigger_volumes is EXACT at 1088. The unmodified baseline gives 64/2/0. My baseline object equals build/base, and my candidate object equals the worker's cand.obj except for .debug$S.
|
||||
(3) object_audit: FAIL(13), all pre-existing (begin_random plus the 12 converter storage rows); the baseline is FAIL(14). The only new surplus is +.text _point_from_line3d, 48 B.
|
||||
(4) Surplus: _point_from_line3d is new and IDENTICAL to January's selected copy in action_charge.obj. The other 4 surplus COMDATs are IDENTICAL too.
|
||||
- provider_link --baseline: PASS in both orders.
|
||||
- nodup_census: 24 definers, 0 NODUP.
|
||||
- COMDAT selection is ANY with external storage.
|
||||
- cachebeta publics line 6312 lists _point_from_line3d, so the storage agrees.
|
||||
(5) Owner ruling 5 (all-inlined header-inline class) and the exception at docs/campaign_house_rules.md:33-40: all five conditions hold. The full build sweep is left to the integrator. The opt-in --forbid-emitted-symbol guard flags the COMDAT, as expected; no test or build step enforces it for hs_runtime.
|
||||
(6) /Od re-read (od_linear 0x606c80..0x607462, RTC descriptor 0x607464):
|
||||
- Both side arms call point_from_line3d (0x42e0d0) three times.
|
||||
- The constants are 1.0 / -1.0 / 0.5.
|
||||
- sides={0} zero-inits 24 B per edge iteration.
|
||||
- side is computed before axis.
|
||||
- color is copied, then its alpha is set.
|
||||
- The two render_debug_string_at_point calls are under an if/else.
|
||||
- /Od frame order: matrix, volume_index, scenario, volume, local_extent, world_extent, edge_index, corner, sides, side, axis, color, center, ray, result.
|
||||
(7) Strip tests:
|
||||
- single_tail re-gated: RESIDUAL (the duplicated tail is load-bearing).
|
||||
- New rv_ternary (the if/else string pair back to production's ternary): RESIDUAL, 25 alndiff hunks. The if/else is both load-bearing and /Od-attested.
|
||||
(8) HCEX_Release.pdb, raw CodeView scan:
|
||||
- S_REGREL32 records are matrix, local_extent, world_extent, sides, result, ray, with no S_BLOCK32.
|
||||
- S_COMPILE2 shows language C on VC16.
|
||||
(9) Reviewer probes, each a full-TU gate:
|
||||
- rv_matrix_outer: EXACT.
|
||||
- rv_full_od: EXACT.
|
||||
- rv_volume_outer: EXACT.
|
||||
- The objects from rv_matrix_outer and rv_full_od are identical to cand.obj in every non-debug section, relocation and symbol.
|
||||
(10) The amended file (CRLF) gates 65/1/0 EXACT, and /W3 /WX is clean.
|
||||
(11) Composition with hs_runtime_converter_storage.patch:
|
||||
- Result is the same in either order.
|
||||
- Gate 65/1/0.
|
||||
- object_audit FAIL(1), begin_random only.
|
||||
- provider_link PASS on all surplus.
|
||||
- The composed object is identical to the worker's compose.obj.
|
||||
(12) park_retire applied to a copy: parked entries go from 86 to 85. Only {hs_runtime, _render_debug_trigger_volumes} is removed, everything else is unchanged, and the JSON is valid.
|
||||
(13) No header, symbols.json or config status change. The tracked tree is still clean.
|
||||
|
||||
## issues
|
||||
Rejected as submitted because the block grouping contradicts the /Od declaration order. It is fixable, and the fix gives an identical object. This is the same finding class as the wave-2 light_volumes rejection, and brief section 9 records the same rule.
|
||||
|
||||
F1: in the /Od frame, `matrix` is at -0x40, the first user slot, above volume_index -0x48, scenario -0x4c and volume -0x50. The submitted patch declares matrix first in the volume-loop block, which is textually after the outer `short volume_index; struct scenario *scenario`. It also declares center, ray and result at the top of the loop block, before the edge-loop locals sides/side/axis/color; /Od places them after color.
|
||||
- None of the worker's 7 order variants puts matrix before volume_index, so the MANIFEST claim that the full /Od frame order was measured is inaccurate.
|
||||
- Reviewer variant rv_full_od moves `real_matrix4x3 matrix;` to the top of the if-block and wraps the tail in `{ real_point3d center; real_vector3d ray; struct collision_result result; ... }` after the edge loop. It follows the complete /Od order and is EXACT (65/1/0), giving an object identical to cand.obj.
|
||||
- The block is justified by the escape law: all three addresses reach out-of-line calls (collision_test_vector and render_debug_string_at_point). It is byte-inert, so it passes the strip test.
|
||||
- HCEX_Release.pdb corroborates it: a C-language VC16 compiland (C89 declarations) with records matrix, local_extent, world_extent, sides, result, ray. That order is not first-use order, and it puts ray/result after the per-edge `sides`.
|
||||
- Fallback if the owner judges the block invented: fallback/production_matrix_only.patch (rv_matrix_outer) is also EXACT with an identical object. It fixes only the matrix contradiction.
|
||||
|
||||
Everything else checks out and needs no change:
|
||||
- exactness, 34 relocations, sha 5789a872;
|
||||
- the /Od-attested duplicated arm tail and if/else string pair, both load-bearing under strip tests;
|
||||
- HCEX/RTC names;
|
||||
- the ruling-5 _point_from_line3d COMDAT: IDENTICAL, provider link PASS in both orders, 0 NODUP, PDB-public external;
|
||||
- zero regressions in the unit;
|
||||
- park retirement;
|
||||
- composition with the storage patch.
|
||||
|
||||
Minor inaccuracy: the worker's claim that GNU patch reproduces the file from the CRLF working tree only holds with `patch --binary`. git apply works fine.
|
||||
|
||||
APPLY INSTEAD of production.patch:
|
||||
- LF: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime__render_debug_trigger_volumes\amended\production_amended.patch
|
||||
- CRLF variant: amended\production_amended_crlf.patch
|
||||
|
||||
Apply it together with the worker's park_retire.patch (approved unchanged). Then run a full ninja and the stable sweep, and re-run surplus/provider_link after the Codex real_math packet lands. hs_runtime stays NonMatching because of the retired begin_random tie.
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# REVIEW source/hs/hs_runtime (storage: 12 converters)
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime_storage\hs_runtime_converter_storage.patch
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/hs/hs_runtime",
|
||||
"approve": true,
|
||||
"issues": "Byte-inert: identical code, data and relocations; only the 12 storage classes change from 2 to 3. object_audit symbol rows go from 12 to 0, PDB-storage disagreements from 12 to 0, and provider_link from FAIL(12) to PASS. The object remains NonMatching at 64/66 (65/66 once the sibling's patch is applied). Advisory: add a superseding note to the 20260904 reconciliation ledger."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
All checks ran at HEAD b7c1b7d9 (the marker on f6d00a8c); the tree was clean at the start and the end. Evidence is in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_hs_runtime_storage_12_converters\ (REVIEW.md, LEDGER.md). The orchestrator's slug contains ':', which Windows does not allow, so the directory name was sanitised.
|
||||
(1) Patch application. `git apply --check -v` and `--whitespace=error` are clean in the worktree. GNU patch on the HEAD blob reproduces the worker's cand.c exactly. A scripted check confirms each of the 24 changed lines is `'static ' + old line`.
|
||||
(2) Gate. gate.py --all on base and cand gives identical rows: 64 exact, 2 residual (_hs_evaluate_begin_random, _render_debug_trigger_volumes), 0 unwritten. All 12 converters are EXACT.
|
||||
(3) Raw object diff, base.obj vs cand.obj. The two objects differ in 20 bytes: 8 are the PID in the scratch/_gate_<pid> path (.debug$S and .file aux), and 12 are the storage-class bytes, which go from 2 to 3. The symbol table order, names, sections and values are identical (505/505).
|
||||
(4) object_audit. Base fails with 14 findings (2 .text residuals + 12 storage rows); cand fails with 2, the two .text residuals only. All 129 January symbols match in cand, and all data sections are ok.
|
||||
(5) PDB storage. Production has 12 disagreements; cand has 0. In cachebeta publics for RVA 0xB9800-0xBAA00, the only publics are hs_runtime_initialize, dispose_from_old_map, dispose, hs_can_cast and hs_cast. The converters at 0xBA220-0xBA38F are absent, so they were file-static.
|
||||
(6) HCEX DIA2Dump (my own run). The two converters I dumped (hs_object_to_object_list, hs_real_to_long) show `static function: true`; the worker's dump (hcex_all.txt) shows the same for all 12. The control hs_cast is a SymTag 0xA public.
|
||||
(7) provider_link. Base fails with 12 'NO JANUARY PROVIDER'. Cand passes: all 25 surplus rows pass in both link orders.
|
||||
(8) surplus_identity, re-run on my objects. The 4 COMDATs are identical to January's providers.
|
||||
(9) Consumers. Outside scratch, the names occur only in hs_runtime.c and symbols.json:3203-3214 (already "static": true). Across 1454 build/base+split objects there are zero undefined references to any of the 12 names, and no January object defines any of them as external.
|
||||
(10) objdiff 3.3.1 (sha1 3130e428) report on a private mini project. The prod, base and cand units are identical: matched_code 10294, 60 functions, data 100%. All 66 per-function rows are equal, so there is no scorer gain or loss.
|
||||
(11) CL /Zs /W3. Base and cand produce identical warning sets (138 lines).
|
||||
(12) fake_match_scan finds 0 leads in both.
|
||||
(13) Composition with the sibling render_debug_trigger_volumes production.patch. Both application orders give the same file, and sequential git apply works with offset -8. The composed file gates 65/1/0, and its object_audit fails only on begin_random. Against the sibling's applied object there are 0 section diffs, and only the 12 storage classes differ.
|
||||
(14) House-rule review. STRIP TEST: removing `static` restores byte-identical code and data, so the keyword buys no byte match. It is a storage-truth fix supported by 3 independent sources: January split storage 3, absence from cachebeta publics, and the HCEX static flag. The patch adds no new declarations or scopes, no header, COMDAT or P1 change, and no held class. Parks and the config status are untouched.
|
||||
|
||||
## issues
|
||||
No blocking issues. Advisory notes for the integrator:
|
||||
(a) The whole unit source/hs/hs_runtime is claimed by the sibling r2w1 render_debug_trigger_volumes. Either application order works, but the integrator still has to apply both patches.
|
||||
(b) Add a note to docs/object_matching_logs/hs_runtime_obj_opus_reconciliation_20260904.md that supersedes its 'Deliberate linkage exception' paragraph. That paragraph assumed the typecasting_procedures matrix was absent, which is no longer true: the matrix has been present since 4f4c8502 and its .data section audits ok.
|
||||
(c) Credit is 0 B, which is correct. The object stays NonMatching.
|
||||
(d) Out of scope and already present in base: the typedef `long (*hs_typecasting_procedure)(long)` (hs_runtime.c:383, matching the HCEX signature) does not match the union-spelled converters. The matrix initialiser raises C4028/C4133 warnings, and this patch leaves them unchanged.
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
# REVIEW source/rasterizer/xbox/rasterizer_xbox_hardware_geometry
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_rasterizer_xbox_hardware_geometry\amended\01_rasterizer_xbox_hardware_geometry.c.patch (apply together with amended\02_symbols.json.patch and amended\03_config.json.patch in the same folder; 02 and 03 are byte copies of the worker's patches)
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/rasterizer/xbox/rasterizer_xbox_hardware_geometry",
|
||||
"approve": true,
|
||||
"issues": "Approved as OBJECT_COMPLETE (+1 admission, credit-neutral). Use amended 01: comment-only fix of the address order (wrapper 0x00158460, callee 0x00158450). The argument and position of the call are byte-inert and disclosed. SDK-table surplus is consistent with 62 canonical Matching objects. 01 and 02 must land together."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
All checks were re-run independently at HEAD b7c1b7d9 (f6d00a8c blobs c2bb9095, e3580876, b928f182). git status was clean before and after.
|
||||
(1) git apply --check: worker 01, 02 and 03 pass alone and together. The amended 01+02+03 pass together, including --cached. Applying the packet to the HEAD blobs outside the repo gives post-images dc158d97, 6b6e58d3 and 0938f2d0, which equal the worker's cand.c, symbols.json and cfg_B. The symbols.json diff is only the 13 in-place rows 5813-5825.
|
||||
(2) Own csplit emulation: cfg_R was built from my own post-image, using build/tools/csplit.exe. split_ctl equals build/split (833/833). split_R differs from split_ctl only in rasterizer_xbox_hardware_geometry.obj, and split_R equals the worker's split_B (833/833).
|
||||
(3) gate.py --all --forbid-emitted-symbol _point_from_line3d:
|
||||
- candidate vs split_R: guard passed, 17/17 EXACT.
|
||||
- production vs split_R: 15 EXACT + 2 UNWRITTEN, so 01 and 02 must land together.
|
||||
- production vs build/split: 17/17.
|
||||
(4) object_audit: PASS. All 25 sections are ok (17 .text plus 8 .rdata, flags and alignment equal). All 25 symbols match, 0 differ. Production is FAIL(7).
|
||||
(5) pdb_storage against the 19,094 cachebeta publics: candidate 0, production 13.
|
||||
(6) surplus_identity: 0 candidate-only code COMDATs.
|
||||
(7) provider_link: 6 rows PASS in both orders (3 pooled literals, 3 SDK tables). --baseline=production finds no new surplus.
|
||||
(8) Data: all 8 .rdata sections pass coff_compare. objdiff 3.3.1 (sha1 3130e428) mini report gives 898/898 code, 17/17 functions and 584/584 data for both production and candidate, so the change is credit-neutral and the gain is +1 object admission.
|
||||
(9) Atlas records re-read myself: 6455066470 lines 4826-4835 and 7eacac85 lines 4295-4300 (tier map, 2001-09-25 linker maps, lib rasterizer_xbox_hardware_geometry.obj). Relative offsets 0/10/20/60/80/c0 match January. MoveResourceMemory appears only in these records. January's own atlas 4cc87b45 has no record here.
|
||||
(10) XDK header readout: D3DINLINE is static __forceinline. IDirect3DResource8_MRM is at line 2028, D3DVertexBuffer_MRM at 2235, IDirect3DVertexBuffer8_MRM at 2251. D3DMEM_VIDEO=1 (D3D8Types.h:1795).
|
||||
(11) STRIP TEST and inertness labs, each gated against split_R:
|
||||
- Call removed: 15/17 plus the 2 MRM functions UNWRITTEN.
|
||||
- D3DMEM_AGP, call after the create block, call at the end of the success arm: all 17/17, and every section's name and sha equals the candidate's.
|
||||
- Option A with a cast: same slot and bytes, only the name differs (16/17).
|
||||
- IDirect3DVertexBuffer8_MRM: emitted after VB8_Release, so it is excluded.
|
||||
(12) cachebeta.exe read as data: 0 rel32 or absolute references to 0x158410/450/460/470/480/4b0. The scan was validated on known callees (_csmemcpy 219 calls, _display_assert 5579).
|
||||
(13) fake_match_scan: 0 leads. /W3 /WX and /W4 /WX: no warnings.
|
||||
(14) Reference sweep for code_001584xx found no other users. There are no parks, rejections, semantic rows or ownership rows for the unit.
|
||||
(15) SDK-table policy census (sdk_census.py): 62 of 489 canonical Matching objects emit the same 3 SDK tables as surplus.
|
||||
(16) Amended-01 verification: 17/17, object_audit PASS, pdb 0, surplus 0, provider_link PASS, fake scan 0. All non-debug sections are byte-identical to the worker's candidate.
|
||||
|
||||
## issues
|
||||
No blocking issues. APPROVE, but land amended/01 in place of the worker's 01, together with the unchanged 02 and 03.
|
||||
(1) Non-blocking comment error, fixed in amended/01 (comment-only, byte-identical). The worker's disclosure comment says "this no-op XDK wrapper and its D3DResource_MoveResourceMemory callee out of line (0x00158450, 0x00158460)". In reading order that pairs the wrapper with 0x158450. January has it the other way round: D3DResource_MoveResourceMemory is at 0x158450 and D3DVertexBuffer_MoveResourceMemory is at 0x158460. The amended comment reads "January emits this no-op XDK wrapper (0x00158460) and its / D3DResource_MoveResourceMemory callee (0x00158450) out of line; / the argument and position are not recoverable from the bytes."
|
||||
(2) Disclosure: the D3DMEM_VIDEO argument and the call's position are chosen, byte-inert (lab-verified) and unattested. They cannot be recovered from any optimised build because the call is static __forceinline, and the /Od build is the PC DX9 port. The call's EXISTENCE is attested by January's emitted, never-referenced static pair (static-COMDAT law) and by the first-party 2001-09-25 linker-map names. The map name meets round 1's reopen criterion and brief section 8's authentic-name exception to the owner-queue gate, and it settles A vs B (bytes and order cannot).
|
||||
(3) Policy note, not a blocker: the object emits the 3 stock SDK select-any tables as surplus. Canonical rejects rasterizer_xbox_profile and rasterizer_xbox_dynavobgeom under candidate-only-comdat-owner on _D3DSIMPLERENDERSTATEENCODE. Both of those also carry consumer-local declaration debt, which this unit lacks. 62 canonical Matching objects (14 rasterizer_xbox_*) carry the same surplus. If the owner tightens the policy uniformly, this object joins that revisit set.
|
||||
Integrator notes:
|
||||
- The .c and symbols.json patches MUST land together: production source against the new split scores 15/17.
|
||||
- Regenerate csplit afterwards. Only rasterizer_xbox_hardware_geometry.obj changes.
|
||||
- Then run a full ninja, the stable sweep, parks/admission checks and pytest.
|
||||
Full review: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_rasterizer_xbox_hardware_geometry\REVIEW.md. Ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2_rasterizer_xbox_hardware_geometry\LEDGER.md.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# cross-cutting: _rasterizer_frame_statistics_draw declaration-count canary (real_math.h genuine bodies)
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.3
|
||||
|
||||
## route
|
||||
Ask one owner question. _rasterizer_frame_statistics_draw (4,176 B) is exact only at today's exact declared-name count: breakable r1 swept -2..+5 and collisions r1 swept -6..+30, and it is exact only at 0. real_math.h also carries known decompiler-junk bodies (nonuniform_cubic_spline v9..v20, -14 names), so it is a count-coincidence match. Two /Od- and January-attested header bodies are blocked on it: real_local_random's named local (breakable B1) and the valid_real_plane3d __inline (collisions). Rule 'accept its loss' (with _bitmap_copy restored by removing the duplicate bitmap_delete prototype), or fund a rasterizer-family attack on frame_statistics_draw's genuine declarations.
|
||||
|
||||
## why_new
|
||||
The r1 lanes recorded this victim separately, once per object. Put together, one ruling unblocks collisions (complete, +4,752 B) and breakable B1, and plausibly other real_math.h body repairs such as the rotate_vector2d body change noted in Lane B's turning log.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 breakable wave2 B1 (dummy-prototype oracle reproduces the flips; no -1 compensator); r1 collisions LEDGER step 6 (-6..+30); owner queue 'held: breakable_surfaces B1, bitmap_drawing'.
|
||||
|
||||
## notes
|
||||
real_math is RESERVED for the Codex packet; sequence any real_math.h packet after the Codex report and gate it with the full 447-TU sweep.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/action_charge
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.3
|
||||
|
||||
## route
|
||||
The round-1 reviewer's three owner questions stand. (a) Admit the load-bearing aggregate view copies C1/C2 (/Od integer copies at 0x4310c8/0x4311c7) on the action_obey 3ba2eb91 precedent; this is the s5 class. (b) Admit the /Od-only dead target_point copy-and-modify. January's bytes cannot distinguish it from fillers: x_suicide/x_top and 3-7 `long m8_N = 0` dummies are also exact. That makes it the held declared-name-count class. (c) Choose the named-result subset. If (b) is refused, no admissible exact form is known. If yes, land the minimal review variant no_a4_vec.c, re-measured `== exact 22 residual 0` at f6d00a8c, with BUG/inferred disclosure.
|
||||
|
||||
## why_new
|
||||
Nothing new. HCEX DIA2Dump for action_charge_perform lists vector_to_target, horizontal_velocity, vertical_velocity, aim_vector, minimum_velocity, target_alignment_vector and alignment_vector. It has NO target_point, no success flag and no scalar result names, so it adds no attestation for the IL-count closure.
|
||||
|
||||
## prior_negatives_checked
|
||||
Read the round-1 fn_action_charge and REVIEW (approve=False; B1-B3; the full /Od local set is residual; swap_a3a_a3b is also exact; c1m/c2m member-wise residual), Lane B's owner_ruling_struct_copy history and the opus5 250k w3c / fresh_graphs ledgers listed in hints. Production is 21/1 [size 3264!=3248] at f6d00a8c. pdb: 0 disagreements. Link PASS.
|
||||
|
||||
## notes
|
||||
On a yes, 1 object completes (+3,248 B). Workers should not run further dead-local or declaration-order sweeps; the count map is already recorded in the round-1 ledger sections 2-3.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/actions
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.5
|
||||
|
||||
## route
|
||||
Two owner or integrator items, both measured ready. (1) Extend the 2026-09-20 TU-private squaring-macro ruling (actor_perception_distance_squared) to actions.c: `#define actor_action_distance_squared(distance) ((distance) * (distance))` at the vehicle_entry square. Round-1 owner_gated_exact.patch / cand_exact.c is re-measured at f6d00a8c as `== exact 63 residual 0`; it retires the vehicle_entry park. (2) Credit the 2,404 B of data, which is identical under coff_compare but under-scored by the objdiff 3.3.1 '$' defect. This needs the grouped-extent verifier_combined_extent.diff to semantic_progress.py plus the 46-member grouped entry, or a move to objdiff 3.6.0. A single-section entry cannot cover this unit.
|
||||
|
||||
## why_new
|
||||
Not new. Both items are in the round-1 held tables (structural owner packet s7; main ledger 'actions grouped data entry'). I searched for first-party evidence that would convert them to ADMISSION and found none. source/ has only actor_perception's admitted macro, Marathon 2 has no SQUARE/SQR macro, /Od strings (odbuild str 'squared') show none, and /Od 0x42ade6 is an inline mulss.
|
||||
|
||||
## prior_negatives_checked
|
||||
Read the round-1 fn2_actions results (V1-V5, VE1-VE9, od1-od11, g1-g7, square battery d1-d10, double temps; a paren on one operand breaks load sharing; `(d)*(d)` by hand also matches, the weaker class), the park evidence (enclosing negative-guard rewrite 39->240) and structural packet s7. cand_fuzzy.c is 62/1 and production is 62/1 at f6d00a8c. pdb_storage: 0 disagreements. Board: link PASS, audit FAIL(1) on vehicle_entry only.
|
||||
|
||||
## notes
|
||||
On yes to both, 1 object completes (+960 code, +2,404 data). The landable-now zero-credit production_fuzzy.patch (one 5-byte FP/int transposition, park re-baseline to 7ef7a0e0) does not appear to have landed. The park still records base sha 80e7bf25; the integrator may take it if (1) is refused.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/actor_looking
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None for closure. Only _actor_look_update is left: 4704 vs 4720 bytes, same 0x58 frame, 159/159 relocations with an identical multiset. The difference is register/slot colouring: January puts primary_priority in edi and pins zero in ebx, and secondary_aim_valid spills to [ebp-7]; ours has them in ebx, edi and bl. Even if update closes, admission still needs the RESERVED Codex actor_combat _cross_product2d provider packet, because provider link currently fails on _cross_product2d.
|
||||
|
||||
## why_new
|
||||
Nothing new. I re-checked round 1's reopen criterion (2), a missed header-helper spelling at another update site, against the full /Od call map of update (0x45f5d0). Every call matches our spelling: cosine 0x455220 x5 (already landed), dot_product3d x3, dot_product2d x2, normalize2d 0x42e020 x4, and fabs x1 at the realcmp site 0x460ffe. The fabs chain has two levels (0x42dec0 -> 0x42e400 -> CRT). That is the C++ fabs(float) -> fabsf chain, not a Halo helper. Cosine's chain has three levels (cosine -> cos(float) -> cosf). So realcmp's direct fabs is already the /Od spelling and this was a negative result.
|
||||
|
||||
## prior_negatives_checked
|
||||
actor_looking_obj_evidence_closeout_20260919 (census of 139 candidates, 12 history blobs); astra_90pct_research10 + independent review (saved-major-results shape was byte-inert); round-1 wave1 fn_actor_looking_*_actor_look_update (stop rule after 9 /Od shapes: cosine() sites, U1/U2/U4/U5, Va/Vb view copies, Vc dot argument order, name-count K=1..24); round-1 REVIEW of find_prop (the cosine lever closed find_prop, not update). My own check: /Od callee census (scratch/w/triage_ai_b/od_look_update.txt).
|
||||
|
||||
## notes
|
||||
Reopen only for round 1's criterion (1): a genuine source construct that gives the facing/aiming CSE pointers long-lived webs, verified with the lane A allocator replay. Criterion (2) is now exhausted. Criterion (3) is an owner decision on the /Od view copies once update is otherwise exact. Evidence: scratch/w/triage_ai_b/LEDGER.md.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/actor_moving
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.08
|
||||
|
||||
## route
|
||||
No route closes any of the 5 residuals. There is ready zero-credit hygiene, measured row-neutral: (a) delete `#define REAL_MATH_EXTERNAL_POINT_FROM_LINE3D` / `#undef` (actor_moving.c:207/238). All 36 rows are unchanged. calculate_movement and try_evasion_vector keep their out-of-line _point_from_line3d calls, as in January. The object then defines a 48 B _point_from_line3d (sha 9b763841) byte-identical to action_charge's selected copy, and provider_link passes. (b) Rewrite the hand-expanded actor_move_transform_avoidance_vector as /Od 0x467840 has it: `*direction = *global_zero_vector3d;` then 3x point_from_line3d(dir,&basis,v->i/j/k,dir). It stays EXACT at 144, and get_avoidance_direction stays EXACT. Production's form is a rule-6 hand expansion. (c) The move_update blend (/Od 0x4684fd) and the test_avoidance_vector / vector_avoidance-perpendicular point_from_line3d forms are /Od-attested fidelity fixes. All are non-exact, so they earn zero credit.
|
||||
|
||||
## why_new
|
||||
New since the last actor_moving work (0920): owner ruling 1 (0921) lifts the point_from_line3d guard for actor_moving, which is one of the 17 January objects that references it out of line. I measured the define drop as row-neutral with a clean provider link. That makes the point_from_line3d forms admissible, but they do not close anything. test_avoidance_vector with the /Od form (7x point_from_line3d + scale_vector3d, no transform call; /Od 0x466b10) reaches 768 vs 752 bytes, 16/16 relocations and 276 vs 272 instructions. Five shapes of mine all leave the same residual: P2 (ta5 at HEAD), P3 (/Od locals: frame grows to 0x444), P8 (/Od statement order: 47 blocks), P9 (escape-law block scopes, frame back to 0x438), and P10 (/Od declaration order). In that residual, January loads the ray fields for the 2nd/3rd point_from_line3d of each vector only after the previous store to offset.z, as `fld [edi+8]; fst [ebp-4]`. Ours hoists them as integer prefetches. No source construct for that memory ordering has been identified. The other four residuals: vector_avoidance has frame 0x60e4 vs 0x60e0 (+4, unidentified scalar), and the perpendicular point_from_line3d form (P4) gives no gain (222->231 blocks). move_update P5 goes 97->90 blocks; the rest is a reversed LAW Z (we pin zero in edi) plus the crouch family. P6 tried the ternary-outside TEST_FLAG, which January's bytes suggest (`test bl; test dh,dh; test dh,0x40`); it materialises the value (3120 bytes) and does not close. path_refresh: /Od 0x46c720 has our structure; 3 && edges bind to the far epilogue copy. destination_update: T tie.
|
||||
|
||||
## prior_negatives_checked
|
||||
actor_moving_obj_opus5_next150_n4_20260915 (transform inline matrix, section-order proof); w1 worker notes ta1-ta9 (opus5-150k scratch/workers/actor_moving.md: ta5 point_from_line3d form, same t-def residual); 150k_w3 (path_refresh 6 forms, va6 0x60e4); 250k_w3d; astra_90pct_actor_moving_avoidance_packet_20260920; astra research11 (move_update, 45 shapes); claude_lane_a_waveA4 (crouch || form 3104); Lane A pathrefresh NOTES (v1 nest inert, v2 worse); laws_w3 D (destination_update 5 shapes).
|
||||
|
||||
## notes
|
||||
The probability is for test_avoidance_vector (752 B), the best lead in this family, if someone finds why January keeps the ray-field loads behind the preceding point_from_line3d stores (an alias/memory-dependence ordering difference, not a register tie). Probes: scratch/w/triage_ai_b/p1..p10 *.json/*.obj. Hygiene (a)+(b) can land now at zero credit after a full sweep: the unit is unchanged and provider link passes.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/actor_perception
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.5
|
||||
|
||||
## route
|
||||
Round-1 Packet B (production.patch / final_full.c, blockage body only) closes the object at 44/44. Packets A and C have already landed at f6d00a8c. The link and distance3d provider blockers are cleared by Layer 2, pdb has 0 disagreements and data has no gap. The owner must rule on structural owner packet 20260923 section 5: a load-bearing /Od-attested aggregate 3D->2D view copy `source_planar_direction = *(real_vector2d const *)source_vector;`. The field copy gives 384!=400. The review also discloses two further /Od-only constructs at 0x4710a0: an empty then-arm at hes<0.36 and an explicit `else blockage = 0;`. On a yes, apply the blockage hunk and retire the park. Under 3c74fa36 the new COMDATs (_normalize2d, _scale_vector2d, _dot_product2d, _negate_vector3d) no longer need a separate ruling: all are byte-identical and provider_link passes.
|
||||
|
||||
## why_new
|
||||
Nothing is new at worker level. The new fact is that the blocker set has shrunk to s5 alone. The distance3d/distance_squared2d provider conflict is gone (board: SELECTED-PROVIDER LINK PASS), and the COMDAT-emission question is covered by the 2026-09-23 house-rule exception.
|
||||
|
||||
## prior_negatives_checked
|
||||
Read the round-1 fn_actor_perception and REVIEW results (field copies F1-F3 give 384; plain !(hes<0.36) gives [sha]; dropping the else zero store gives 384; M8 bo1-7 inert), the park evidence (2026-09-20 short-carrier decode), structural owner packet s5 and the 0925 main ledger. Measured without editing: the unmodified round-1 final_full.c gates `== exact 44 residual 0` at f6d00a8c and differs from production only in the blockage function. Production's blockage body currently hand-expands point_from_line3d, negate and dot (rule 6/13 debt).
|
||||
|
||||
## notes
|
||||
On a yes, 1 object completes (+400 B). No castless January spelling exists in any ledger. The /Od aggregate integer copy (one base load, both dwords loaded before both stores) is the attestation. Workers should not spend more shapes here.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/actors
|
||||
|
||||
## decision
|
||||
ATTACK
|
||||
|
||||
## est_probability
|
||||
0.15
|
||||
|
||||
## route
|
||||
_actor_input_update (2384 B), low-probability route taken from the /Od readout. Replace production's hand-inlined swarm-loop body with the calls the /Od build makes. (a) `actor_swarm_component_refresh(swarm->unit_indices[i], swarm->component_indices[i]);`: fn 0x44bb30's body is exactly this TU static. January defines _actor_swarm_component_refresh (80 B) and setup calls it out of line (reloc @0x65), but input_update has no call, so VC7 inlined it at the loop site. (b) `add_vectors3d(&component->position, &swarm->swarm_center, &swarm->swarm_center);` (fn 0x44e8e0). Optionally also (c) the /Od threat-loop shape: a named projectile alias local ([ebp-0x70]) and if-flag / else-if danger-zone with two stores, in place of the single `||` store. Measure whether the extra IL moves the unit live-range split at the aiming join (0x6a6: January lea edx,[ebx+0x1ec] vs our add ebx,0x1ec plus a reload at 0x6c2), the pre-threat-loop unit piece (eax vs ebx at 0x4d3), and the cross_product3d x87 leaves.
|
||||
|
||||
## why_new
|
||||
None of the earlier input_update lanes consulted the /Od build: the 0902 wave, opus5 waveD/w2/w3/w3d, the 0919 closeout and Lane A res7 (0920). None of their shapes call actor_swarm_component_refresh or add_vectors3d, or split the threat store. The production swarm loop hand-copies a TU static (house rule 13, manual inlining) and hand-expands a header helper (rule 6). Two decoded laws tie IL shape to allocation. R27: inline parameters raise block pressure, which flipped an allocation in customize_unit. Lane A S4/S7: the function's IL-local count moves the cross_product3d x87 phase.
|
||||
|
||||
## prior_negatives_checked
|
||||
Read the do-not-repeat tables in actors opus5 w2/w3/w3d, the closeout 0919 (8 pointer/value/component/helper/control spellings) and Lane A res7 NOTES. Those cover declaration order (S3), scope hoist (S2), arm inversion (S5), local count -1 twice (S4/S7, lateral), the component_datum_index fold (S6, worse), single-exit swarm arm (iu2, identical), swarm_center lvalue (iu3, landed) and short component_index (waveD, no). dis_range at f6d00a8c confirms the three residual sites. /Od 0x4486c0 was dumped to od_actor_input_update.txt. nodup_census: _add_vectors3d has 17 definers and 0 NODUP.
|
||||
|
||||
## notes
|
||||
Skeptical estimate. The unit split proved insensitive to local count in S4/S7, and the swarm arm is control-flow disjoint from unit's live range, so the mechanism link is indirect. Constraint: the add_vectors3d call newly emits _add_vectors3d, and from a non-exact caller that is the P1 class, so that half lands only if the function goes strict exact. The refresh-call half is a genuine rule-13 fix and could land at zero credit with a park re-baseline. Stop after these /Od-attested shapes plus at most two combinations. Otherwise retire, with reopen criterion: a donor for the add/lea split at a 3-edge join.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/ai_communication
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None for closure. talk_weight: the single real region at +0x35f is the operand order of `cause_matches | subject_matches` (Jan `mov al,[ebp-3]; or al,[ebp-2]`); frame slots are identical. From the /Od (0x48ca30, found by scanning for the 10.0/5.0 constants) I took subject declared before cause and the expression `subject | cause`. Q1 (declaration order), Q2 (operand order) and Q3 (both) are all byte-inert. finished is the recorded cross-jump floor. event: the structural lane's v10h candidate was never landed. It reaches size 8064 (equal to January), 336/336 relocations and the 0x126c frame, but still has 74 real hunks. Beyond that it needs the allegiance_incident_type enum moved into game_allegiance.h and has register ties left. The /Od-attested uninitialised play_type read is a HELD January-bug class, and even with it the frame goes +8. So an owner ruling would not close event either.
|
||||
|
||||
## why_new
|
||||
New facts: (1) the talk_weight /Od declaration and operand order were measured inert (Q1-Q3), which strengthens the park. (2) event's normalize2d blocker from 0923 (the action_charge NODUP provider) is probably gone: action_charge.c now uses the header normalize2d after the round-1 provider repair. Not measured here, and it does not fix event's ties. (3) Admission prerequisites, confirmed from first-party data: _ai_conversation_new is not a cachebeta public, and none of 833 January split objects references it, so it was file-static in January; ours is external and has a prototype in ai_communication.h. _actor_reset_idle_vocalization_timer and _ai_communication_update_speech_timers are already static in ours and need symbols.json "static": true. .data 276 is coff_compare-identical (69 relocations); its 50% score is the objdiff 3.3.1 '$'-literal defect, a scorer-version effect. The TU also carries consumer-local prototypes of foreign functions (unit_test_speech, unit_speak, actor_iterator_new/next, actor_audibility_at_point, etc.).
|
||||
|
||||
## prior_negatives_checked
|
||||
config/parked.json entries for talk_weight (instruction-scheduling) and finished (register-allocation; 19 shapes, claude_lane_a_crossjump_ai_communication_finished_20260920); ai_communication_obj_opus5_150k_w3 (tw0-tw5); commit 3fdad47e (event owner ruling 0920); claude_structural_HANDOFF_20260923 + claude-structural-20260923 scratch/lane/w/ai__ai_communication/REPORT.md (v1-v10h, v6 play_type frame +8, v8 normalize2d); Lane B rejected hypotheses (update_speech_timers is a declaration-count tie on real_math.h); docs/objdiff_data_relocation_defect_20260922.md.
|
||||
|
||||
## notes
|
||||
event v10h (+ v8 normalize2d, now that provider link should pass) could land as a zero-credit fidelity packet after the game_allegiance.h enum sweep. Making _ai_conversation_new static changes its ABI, so measure that (it is currently EXACT at 304) before the integrator applies it.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/ai_debug
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None for closure. _ai_debug_render_actor (24,976 vs 25,008 bytes) has frame, slots and the 1,905-entry relocation multiset equal (structural batch b5, 0923). real_regions shows 97 REAL regions out of 1,165; the rest are addressing-only. The samples are x87 staging, e.g. Jan `fmul 0.1f; fst [ebp-0x1c]; fadd [ebp-0x10]` vs ours `fstp; fld; fadd` at the hand-written mid_point/p1/p3 offsets. January CSEs the product across + and -, so the arithmetic is authentic, not two point_from_line3d calls. There is no admissible lever.
|
||||
|
||||
## why_new
|
||||
Nothing new for code. Ready admission prerequisites for when render_actor closes: (1) 19 `_code_` placeholders have Halo CE atlas names, verified against 25 already-named anchors at off-0x400000 (e.g. code_00039990 -> _ai_debug_render_path_node, code_0003a910 -> _ai_debug_render_path_nodes, code_000386a0 -> _ai_debug_speech_update, code_000411d0 -> _ai_debug_render_all_actors). Two are also MAP-attested (astra research18). The batch was measured byte-inert in 0914/0915 and has been pending since. code_00038280 has no atlas entry. (2) 33 symbols are storage 2 in the split, 3 in ours, and not cachebeta publics, so ours is right and symbols.json needs "static": true. (3) _ai_debug_render_actor_jmptable is a label inside the parent section (ledger 0923). (4) .data 56 is coff-identical; the <100% score is the scorer defect.
|
||||
|
||||
## prior_negatives_checked
|
||||
claude_structural_HANDOFF_20260923 (b5: remaining ~43 width-normalised bytes are x87 staging + one tail merge, no admissible lever); ai_debug_obj_opus5_next150_n2_20260915 (atlas rename proposal, A23 law); ai_debug_obj_opus5_150k_w2 (20-name batch inert); astra wave2/research12 packets; claude_lane_a_waveC (four defects fixed); ai_debug_jmptable_owner_20260923.
|
||||
|
||||
## notes
|
||||
The render_actor residual is x87 register-stack staging spread over a 25 KB function. Reopen only with a decoded x87 spill/staging law. The naming and storage packet can ride with any future closure.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/ai/path_obstacles
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.3
|
||||
|
||||
## route
|
||||
_obstacles_test_circle (160 B) is exact only with a parenthesised field operand. That is `radius + (disc->radius)` or a TU-private accessor such as `((disc)->radius)`, measured by Lane B try_2/3/6; try_4/try_5 and all bare spellings are residual. Brief section 2 lists this as an owner-held item. The 2026-09-20 named-accessor ruling does not cover it: it requires a first-party-attested accessor name, and none exists (/Od strings, the atlas and HCEX have no disc-radius accessor). The owner must extend that ruling or keep the hold. Separate admission prerequisite found: pdb_storage flags `_global_obstacle_colors` (split and ours storage 2) as absent from cachebeta publics, so it is January file-static, and no other object references it. It needs `static` in path_obstacles.c, `"static": true` on symbols.json line 22351 edited in place, and a csplit-only regen.
|
||||
|
||||
## why_new
|
||||
The only new item is the storage correction for `_global_obstacle_colors`, which previous path_obstacles ledgers did not record. The match itself is the held item.
|
||||
|
||||
## prior_negatives_checked
|
||||
Read path_obstacles_obj_circle_query_natural_20260906, three_leaf_object_closeout_king_path_cache_20260919 (HCEA dx/dy/combined-radius forms, reversed relational: all residual), the Lane B path_obstacles_REPORT (try_1-6, M8 D=1..8 and H3 K=1..32 insensitive, test_pill swap inert), claude_lane_a_adjudication_paren_accessor_20260920 (ruling scope), five/second_five_small_objects_admission_20260923 ('user's held path_obstacles parenthesis lever'), and odbuild str 'disc'.
|
||||
|
||||
## notes
|
||||
Workers must not retry this; natural spellings are exhausted. On an owner yes plus the storage fix, the object completes: board audit FAIL(1) is this function only, link PASS, data gap 0. The static name global_obstacle_colors is descriptive and not first-party; atlas and HCEX are silent. That is acceptable under house rule 7 but should be disclosed.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/bink/bink_playback
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.85
|
||||
|
||||
## route
|
||||
The owner rules on the q3 else-if START/BACK split for _bink_query_analog_controller_buttons (round-1 production.patch; 24/24 and object_audit PASS). The unoptimised-witness criterion of the 26601453 ruling cannot be met: /Od and HCEA hold only bink stubs. The evidence offered instead is cross-build: q3 matches January, Oct 2276betaP and 2276P in 4 of 4 compiled contexts, while the || form matches 1 of 4. Land it with the pending storage packet: static bink_pointer_blocks, bink_bitmap, bink_texture and bink_pointer_block_count, plus symbols.json lines 23299/23300/23301/23304 and a csplit regen.
|
||||
|
||||
## why_new
|
||||
No new evidence. The round-1 cross-build corroboration is already the strongest available.
|
||||
|
||||
## prior_negatives_checked
|
||||
bink_playback_obj_fable_graph_reconciliation_20260908; opus5 150k w2, n1, n3a, n4, n5 (10 shapes); round-1 wave1 (name-count 0-80, operand-type probes, context emulations).
|
||||
|
||||
## notes
|
||||
On a yes, completion also needs the storage packet. _code_001b5850 keeps its address-derived name: it is unreferenced and non-public, and a static copy is dropped. That name is a house-rule naming item the owner should confirm.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/bitmaps/bitmap_drawing
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.1
|
||||
|
||||
## route
|
||||
The only blocker is the unreferenced 16-byte initialised .data prefix (ff x10, 00 x6) before the public translation_table. cachebeta section contributions prove bitmap_drawing owns it, and HEK sapien.exe shows the same adjacency. It needs a first-party name and type, or an owner ruling admitting a descriptive static under the 2026-09-20 unnamed-global hold. The type cannot be recovered from the bytes: a 10-byte char[], 5 shorts and 3 longs all give the same 16-aligned layout. The optional zero-credit `static word const bitmap_bevel_sequence_indices` storage fix from round 1 stays available.
|
||||
|
||||
## why_new
|
||||
Nothing new; only the negative search was extended. HCEX.pdb globals (-g) have no translation_table/bevel/bitmap_draw record (only an unrelated global_post_combat_translation_table). All 11 atlas files, including both Sept-2001 map-tier files, carry only bitmap_drawing function names. The /Od build has no 'translation_table' string.
|
||||
|
||||
## prior_negatives_checked
|
||||
bitmap_drawing_prefix_evidence_20260924.md, bitmap_drawing_obj_opus5_150k_w2_20260914.md, bitmap_drawing_obj_codex_reconstruction_20260903.md, results/wave1/data_gap_source_bitmaps_bitmap_drawing.md, claude_fifty_objects_20260925.md held-items table row.
|
||||
|
||||
## notes
|
||||
7/7 exact; data gap 2644 B (whole section, all-or-nothing). Do not invent an extent-filling 16-byte global. Evidence: LEDGER.md P2.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/bitmaps/bitmap_group
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.05
|
||||
|
||||
## route
|
||||
None for _bitmap_group_add_bitmap. Round-1 cand.c is 1008/59 relocations with 346/346 instructions, and 4 instructions differ (which operand becomes the destination of the commutative add at the two pixel_data.address sites).
|
||||
|
||||
## why_new
|
||||
Nothing new. No /Od or HCEX copy exists, and the PC lift was already used.
|
||||
|
||||
## prior_negatives_checked
|
||||
bitmap_group_obj* ledgers (8, including cache_enum_reaudit and codex_add_bitmap_fuzzy); round-1 wave2 (operand order, casts, shadow field types, name-count, loop scoping; stop rule); park 33.
|
||||
|
||||
## notes
|
||||
Still-pending zero-credit hygiene: static postprocess_bitmap/delete_bitmap plus symbols.json lines 1224-1225, the own-header include, and a single-section semantic_data_matches entry for _global_bitmap_reference (1,424 B, resolved-equal; integrator-applicable under brief s4.5). A park re-baseline is needed if the round-1 body lands.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/bungie_net/network/transport_endpoint_set_winsock
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.1
|
||||
|
||||
## route
|
||||
Three owner items: (1) _poll_endpoint_set: admit the g1 staging boolean `select_failed = select_result < 0 || select_result == SOCKET_ERROR`, which is EXACT (owner packet 20260923 row 163). (2) _transport_initialize: admit the zero field stores, attested in 3 builds; one byte (the -5 tail join) would still remain. (3) The net_startup_debug static needs an invented call, which the review rejected. _transport_endpoint_set_compare_entries is an EAX/ECX colouring tie and should be RETIRED.
|
||||
|
||||
## why_new
|
||||
Nothing new. The Lane C block-selection law (returns merge on value) does not separate three identical -5 tails, and round-1 already ran about 25 result-placement, return-type and cleanup shapes on that byte.
|
||||
|
||||
## prior_negatives_checked
|
||||
transport_endpoint_set_winsock_obj_initialize_natural_boundary/independent_review_20260905; set_operations_cluster_20260904; round-1 wave3 results for all three functions and the storage review (compare: 25 micro-lab plus 8 prior shapes; init: grid, loop, cleanup, return type, 10 call placements, name-count 0-40).
|
||||
|
||||
## notes
|
||||
Even with every ruling a yes, the object stays incomplete: compare_entries (tie) and the one init byte remain. Low value.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/bungie_net/network/transport_endpoint_winsock
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
The owner admits January's authentic uninitialised `thread` read on take_mutex failure (packet 2: `struct thread_reference *thread;` with a BUG comment). The October betaP body is byte-identical to January. With it, cand_final gives 30/30 and object_audit PASS against the regenerated split.
|
||||
|
||||
## why_new
|
||||
Nothing new. The storage packet has already landed (pdb_storage shows 0 disagreements).
|
||||
|
||||
## prior_negatives_checked
|
||||
transport_endpoint_winsock_obj_async_leaf_packet_20260913; round-1 wave1 result and review (defined alternatives A/B/D all residual); claude_structural_owner_packet_20260923 s4.
|
||||
|
||||
## notes
|
||||
This is a held January-bug class (brief s8).
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/cache/xbox_sound_cache
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.05
|
||||
|
||||
## route
|
||||
None. _sound_cache_debug_render has one x87 k-term operand pair, keyed on January having 4 more referenced user-IL symbol units than the PC /Od inventory. No Xbox source attests them, and adding filler to fill that gap is the forbidden oracle.
|
||||
|
||||
## why_new
|
||||
Nothing new.
|
||||
|
||||
## prior_negatives_checked
|
||||
xbox_sound_cache_obj_complete_fuzzy_closeout_20260901; opus5 150k w2/w3; round-1 wave2 (od1-od3, v1/v2, sd1, helper order, dot argument swap, TEST_FLAG, counters; dead-local oracle threshold D=4); park 30.
|
||||
|
||||
## notes
|
||||
Still-pending zero-credit hygiene: round-1 storage patch A (4 statics plus 6 symbols.json lines; pdb_storage currently shows 2 ours-static/split-external rows and 4 non-public externals). The od3 body would emit _point_from_line3d from a non-exact caller, so it is not landable.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/cache/xbox_texture_cache
|
||||
|
||||
## decision
|
||||
ADMISSION
|
||||
|
||||
## est_probability
|
||||
0.45
|
||||
|
||||
## route
|
||||
All 25 functions are EXACT and the .text/.rdata/.bss sections match (round-1 object_audit). What is left is a hygiene/ownership packet built from first-party evidence. (a) symbols.json rows 7243-7245 (_IDirect3DDevice8_IsBusy@4, _IDirect3DDevice8_KickPushBuffer@4, _IDirect3DBaseTexture8_IsBusy@4) get "static": true, then a csplit regen; none of the three is a cachebeta public, and this clears the audit FAIL(3). (g) NEW: three first-party renames of invented static names, from the 2001-09-25 cachebeta-xbe linker map (delta 0xE900, re-anchored on 20 already-named symbols): row 7239 _texture_cache_debug_block_name -> _texture_cache_name_block_proc; row 7242 _texture_cache_debug_bitmap_compare -> _compare (also January's own atlas 4cc87b45, exact tier, at 0x5ae7b0); row 7250 _texture_cache_build_hardware_format -> _texture_cache_initialize_hardware_format. Rename the matching definitions and prototypes in the .c and refresh the stale _code_ header comment. (b) Replace the TU-local `long bitmap_get_pixel_data_size(...)` prototype with #include "bitmaps/bitmaps_internal.h" (round-1 lab F1: 25/25 still EXACT). (c) Move the texture_cache_debug_render, bitmap_format_to_d3d_format and bitmap_format_to_d3d_linear_format prototypes into cache/texture_cache.h. That header has 14 consumers, so the change needs a full sweep. render_debug.c:564 calls texture_cache_debug_render with no prototype in scope. (d)+(f) Drop the TU-local struct bitmap_data and the xbox_bitmap_group_prefix view with raw tag_get('bitm'), and use bitmaps/bitmap_group.h (struct bitmap_data, bitmap_group_get(); pixel_data sits at 0x30 = processed_pixel_data). First correct bitmap_group.h to HCEX: `DIA2Dump -type bitmap_data` gives 0x16 short mipmap_pad, 0x18 long pixels_offset, 0x1C long pixels_size, 0x20 long tag_index, 0x24 long cache_block_index. The header currently says bitmap_data_pointer and unsigned types, which is wrong and could change codegen, so this is a shared-header edit that needs a sweep. (e) Drop `extern D3DDevice global_d3d_device;` and use rasterizer_xbox.h's `D3DDevice *global_d3d_device`, passing the pointer. tinfo shows _texture_cache_flush has no _global_d3d_device relocation (the wrapper's pThis is dead), so this is expected to be byte-inert.
|
||||
|
||||
## why_new
|
||||
Round 1 approved only the steal_memory function landing (now in the tree: 25/25) and vetoed object status over review items (a)-(f), with no packet proposed. This triage adds first-party resolutions: the Sept-2001 map names for three static functions (item g, not seen by any prior lane; _compare is also January-attested) and the HCEX bitmap_data field record, which shows the genuine owner header bitmap_group.h has the 0x24 field wrong (the TU-local cache_block_index is the right one). It also confirmed from the relocations that the global_d3d_device fix is byte-inert.
|
||||
|
||||
## prior_negatives_checked
|
||||
The round-1 wave1 result and REVIEW (approve=False, items a-f, lab F1). xbox_texture_cache_obj_steal_memory_owner_reconciliation_20260904 (bitmap schema/prototype veto; debug_bitmaps storage). opus5_150k_w2/w3 (point_from_line3d ownership; parks reopened). locked_callback_natural_boundary_20260905 (HCEA name authentication). pdb_storage run on production (3 disagreements). The claude_fifty_objects_20260925 held table lists 'texture_cache header / prototype / bitmap-schema debt (review items a-e)'.
|
||||
|
||||
## notes
|
||||
Risk: texture_cache.h (14 consumers) and bitmap_group.h (45 includers) are shared-header edits, so the declaration-count and header-blast-radius laws apply. Land them as separate measured steps, each with a full per-function sweep. The bitmap type/format/flag enums have no owner header anywhere (bitmaps.c and bink_playback.c also keep TU-local copies). That is board-wide debt, and the integrator may need an owner note if a TU-local enum is judged a blocker. Evidence is in LEDGER P2 and P7.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/camera/observer
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. The zero-credit round-1 packet research/fifty_objects_20260925/w/observer/production.patch still applies cleanly (git apply --check exit 0 at f6d00a8c). It gives the /Od-shaped _observer_update_positions: 1568 bytes, 40 relocations, frame 0x84, park re-baseline needed. It earns no exact credit.
|
||||
|
||||
## why_new
|
||||
Nothing new. At f6d00a8c _observer_update_positions is the only non-exact row: production 1648 bytes, frame 0x90, surplus csmemset. The round-1 candidate closes size, relocations and frame. Eight x87 commutative-leaf instructions remain, in the tail's inlined valid_real_vector3d_axes2 dot product and the first inlined cross_product3d (real_math.h:1718 body checked).
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn2_observer: about 20 /Od-attested natural shapes (L1/L2/L3/F1, Ta/Tb/Tc/Te, declaration-order permutations, cross_product3d local count) and about 120 M8 lab variants covering all 8 count states per family. The stop rule fired. Ledgers observer_obj_opus5_250k_w3d_20260915 and replacement_exact_packet_20260912 were also read. All three round-1 reopen criteria need a decode, different first-party provenance for forward/up, or an exact same-compiler model. None is met: /Od 0x5302b0 attests forward and up both as position-derived locals.
|
||||
|
||||
## notes
|
||||
The object is otherwise clean: 49 January symbols with 0 differences, pdb_storage 0, surplus unchanged. Reopen only on a C2 per-leaf key decode.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/cutscene/cinematics
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. optional_fidelity.patch is a zero-credit /Od fidelity cleanup: same function sha, no park drift. It applies cleanly at f6d00a8c.
|
||||
|
||||
## why_new
|
||||
Nothing new. The only object blocker is the emission order of the two OR operands in the _cinematic_render shadow-colour pack at +0x45d: 4 instructions, with size, 57 relocations, frame and slots equal. I checked the clamp block (cinematics.c:142-148): its fabs(x-1.0f)<eps predicate is the realcmp shape, but round-1 ctx c07 already measured realcmp as inert for the pack.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn2_cinematics: /Od shapes p1..p7, contexts c01-c12, t01-t03, parameter-type labs, 32 H3 and 32 unused-local oracles, M8 D=0..8, F1 1..16. An alloc-oracle forcesearch shows it is not a global colouring tie. The context threshold (0 or >=4 conditional colour stores, or title_bounds not live) is non-periodic. The October betaP XBE is byte-identical to January, which rules out source drift. Ledgers cinematics_obj_opus5_150k_w2 and authenticated_fast_ftol_reopen were also read.
|
||||
|
||||
## notes
|
||||
Reopen needs a c2dbg32 decode of the dag.c commutative-operand key, or January-era title-loop source. The _fast_ftol surplus is identical and link-clean, so a close would complete the object.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/effects/player_effects
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.02
|
||||
|
||||
## route
|
||||
None for functions. Zero-credit hygiene is available: symbols.json `"static": true` on 8 rows (_effect_scale_factor, _effect_scale_value, _get_shake_matrix, _player_effect_globals, _player_effect_update_camera_impulse, _player_effect_update_camera_shake, _player_effect_update_screen_flash, _render_screen_flash_type_map), then a csplit-only regen. pdb_storage shows split 2 / ours 3 / PDB-public False, so our static storage is already right. Optionally, round-1 production.patch (camera-matrix /Od body, park re-baseline) still applies.
|
||||
|
||||
## why_new
|
||||
Nothing new for the three residuals. The storage finding is first-party (cachebeta publics), but it is admission hygiene only, since three functions stay residual.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 wave4 player_effects. add_continuous_effect is EXACT only with the Marathon PIN spelling in cseries.h, which loses 5 strict functions board-wide; s1/s2 variants also lose; ac2-ac9, D=0..16 and N=1..32 were inert. camera_effect_matrix: cm2/cm2b/cm2e, M8 at 4 scopes, pointer locals and /Od order all remain; cross_product3d leaf order is coupled to set_real_point3d. update_camera_impulse: i,k,j vs k,j,i dot order; u1/u2/u12, M8 D=0..8, argument, chain and triple_product3d were all inert. Ledgers opus5_next150_n3a, 250k_w3c and private_helpers_reconciliation were read.
|
||||
|
||||
## notes
|
||||
The PIN parenthesisation key is a header-text/paren-count family. A TU-local paren respelling would be decoration-only parentheses (fake), so no admissible lever exists.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/effects/weather_particle_systems
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.25
|
||||
|
||||
## route
|
||||
(1) Owner ruling on Lane D class I (HANDOFF_20260922 l.142): the /Od-attested dead scalar `short unused_count = 0;`, from init-only slot [ebp-0x24] at /Od 0x57fbb4, with an invented name. On yes, apply round-1 production.patch. (2) Provider dependency: the _real_local_random surplus conflicts with effects.obj's NODUP named-result copy. The fix is a real_math.h body change (`real result = real_seed_random(...); return result;`) plus removing the effects.c hand copy. This is inside the Codex real_math reservation. It needs a full-board re-sweep, because tree D (0914) broke units before Layer 2 changed the name-count landscape. The separable zero-credit fix, dropping `static` from one_over_char_max (cachebeta public 0x25AAFC), can land now.
|
||||
|
||||
## why_new
|
||||
Measured at f6d00a8c. Round-1 fin2.c re-gates 20/20 EXACT with object_audit PASS, but provider_link still FAILs(1) on _real_local_random. New census: January's split defines _real_local_random ONLY in effects.obj, and only first_person_weapons references it. Our base emits the same COMDAT in effects, weather, breakable_surfaces and rasterizer_xbox_environment_fog. So weather's copy is folded surplus from the header inline, whose `return real_seed_random(...)` body ends `pop ecx` while January's selected copy ends `add esp,4`.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn_weather and REVIEW: the strip test fails without unused_count, and the review defers to the owner. opus5_150k_w1: tree D (named-result real_local_random) gave no gain and a units loss. fresh_graphs and helper_recovery_20260923 were read. Render shapes to not repeat: box_count=1, box-offset positions, point-first transform dot.
|
||||
|
||||
## notes
|
||||
Completion needs BOTH the class-I yes AND the provider repair, which depends on real_math.h (Codex-reserved) and a zero-regression sweep. Once the reservation is released, the tree-D header body is worth re-measuring at the current base.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/game/game
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. The only blocker is _game_set_game_variant_from_name (96 B): January keeps `lea edx,[ebp-0x68]; test edx,edx`, a memset arm that pushes edx (known 0), and a 0xd0 two-aggregate frame. VC7 folds every admissible spelling to 48 B / 2 relocations.
|
||||
|
||||
## why_new
|
||||
Nothing new. alndiff re-confirmed the folded address test and the missing _csmemset / second _game_variant_global relocations.
|
||||
|
||||
## prior_negatives_checked
|
||||
Lane B game_REPORT (30 shapes and flags); opus5 n1 (6 in-tree shapes plus 11 lab forms); round-1 wave1 fn_game (8 new probe families, including a 400-compile name-count sweep, /Ob1 __inline, flags, deferral, declaration-plus-initialisation, and an old-style declaration); cross-build readouts (/Od cache_symbols, HEK sapien, Oct 2276P LTCG: the test survives in 5 builds); park 48.
|
||||
|
||||
## notes
|
||||
Reopen only for a first-party game.c/game.h fragment, a C1 IL-level explanation, or a live C2 trace of the inline-fold gate (round-1 criteria). The rest of the object passes audit; pdb_storage shows 0 disagreements.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/game/game_engine
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.8
|
||||
|
||||
## route
|
||||
Owner-queue item 6: Q1 is the in-loop alias (production line 2693, not /Od-attested, load-bearing) versus the /Od-attested `*(real_point2d *)&global_goal[i].position` view copy (load-bearing, so it fails rule-24 byte-inertness). Q2 is the one-consumer headers versus the TU-local variant. Q3 is the debug_player_color pad aggregate and the descriptive teleport statics. Everything is already 180/180 with audit PASS.
|
||||
|
||||
## why_new
|
||||
Checked whether first-party evidence could remove the ruling: in HCEX, netgame_goal.position is union real_point3d with only x/y/z, u/v/w and n[3] members. It has no 2D member, so the /Od 8-byte copy requires the cast and the ruling is still needed.
|
||||
|
||||
## prior_negatives_checked
|
||||
round-1 wave3/wave4 game_engine results and reviews; owner queue item 6; game_engine_obj_large_closeout_20260919.
|
||||
|
||||
## notes
|
||||
On a yes, the packet is research/fifty_objects_20260925/w/owner_queue/pick_game_engine; re-sweep it against any concurrent game_engine.h edits.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/game/players
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.05
|
||||
|
||||
## route
|
||||
_player_examine_nearby_device needs an owner ruling on the callee wrapper macro that parenthesises the fast_vector_intersects_sphere radius (round-1 owner_gated_wrapper_macro.patch; one macro explains all 11 January call sites). _player_teleport_internal is RETIRED: o1 with the real point_from_line3d is exact only under 3 forced allocator decisions.
|
||||
|
||||
## why_new
|
||||
Nothing new. The owner's RB2 ruling (a decoration-only parenthesis is steering) still stands, and no first-party macro or accessor has been found.
|
||||
|
||||
## prior_negatives_checked
|
||||
players_obj* ledgers (9); round-1 wave3 examine (per-TU macro lab) and teleport (11 spellings including static, loop forms, do/while, goto, inline wrapper, K=0..32 name-count, HCEX static-local refuted by symbol name); owner rulings 2026-09-21 #4.
|
||||
|
||||
## notes
|
||||
Completion needs both the examine ruling and a teleport allocator tie that is currently unreachable, so it is effectively blocked. 2 header-declared statics (player_teleport_internal, player_handle_powerup_equipment) remain pdb_storage disagreements.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/hs/hs
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
Code: none. _real_random_range_evaluate differs by one dependency-free `mov ecx,edx` placement (0x27 vs 0x2b); 50/50 instructions, frame and relocations are equal. Data: the 54,780 B gap is the objdiff 3.3.1 '$'-literal defect across two merged sections (coff_compare resolved-equal), so it needs the owner to move the scorer or admit a grouped data entry.
|
||||
|
||||
## why_new
|
||||
Nothing new. alndiff re-confirmed the single-instruction move. The storage packet has landed: pdb_storage shows 0 disagreements and the audit fails only on the one .text row.
|
||||
|
||||
## prior_negatives_checked
|
||||
round-1 wave3 hs__real_random_range_evaluate (13 probe families including K=0..40 name-count, M8 dead-local D=0..16, /Od and HCEX forms, flags; plus 46 prior spellings; stop rule); hs data-gap result (3.6.0 recovers all 54,780 B); REVIEW ownership packet (the real_random_range cleanup is owner-gated because the caller is not exact).
|
||||
|
||||
## notes
|
||||
The data credit is an OWNER item (scorer version / grouped semantic_data entry). It cannot complete the object while the code tie remains.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/hs/hs_runtime::_hs_evaluate_begin_random (528 B)
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. Four ModRM bytes: movsx eax/ecx versus edx/eax into the same dead parameter homes [ebp+0x10]/[ebp+8], with an identical hoist, multiset and frame.
|
||||
|
||||
## why_new
|
||||
Nothing new. I re-confirmed the 4-instruction hunk with alndiff.
|
||||
|
||||
## prior_negatives_checked
|
||||
hs_runtime_obj_opus5_250k_w3c (SKIPPED-EXHAUSTED; A24 parameter-home lever already satisfied; A18/A34 width checks); w1 two inert shapes; park 44 (private-register-convention).
|
||||
|
||||
## notes
|
||||
Reopen only for January local records or a same-compiler donor that explains the loop-invariant sign-extension register choice.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/hs/hs_runtime::_render_debug_trigger_volumes (1088 B)
|
||||
|
||||
## decision
|
||||
ATTACK
|
||||
|
||||
## est_probability
|
||||
0.5
|
||||
|
||||
## route
|
||||
Port the /Od-attested body onto the current hs_runtime.c. Use HCEX local names and `real_vector3d sides[2] = { 0 }`, computing side = edge_index % 2 before axis = edge_index / 2 as /Od does. In BOTH if(side) arms, write points[0] (the side arm via point_from_line3d(&matrix.position, &world_extent, 1.0f, &points[0]); the else arm via points[0] = matrix.position), then the sides assignments and two matrix4x3_transform_vector calls. Each arm must also contain its own point_from_line3d(&points[0], &sides[0], 1.0f, &points[1]), (&points[1], &sides[1], 1.0f, &points[2]) and (&points[2], &sides[0], -1.0f, &points[3]). Compute center with point_from_line3d(&matrix.position, &world_extent, 0.5f, ¢er), and keep the if/else pair of render_debug_string_at_point calls (yellow/white). No hand-expanded arithmetic. Gate it, then run object_audit, surplus_identity and provider_link (the new _point_from_line3d SELECT_ANY COMDAT must be byte-identical) and a full sweep, and land under owner ruling 5 (2026-09-21: the all-inlined header-inline COMDAT class is admitted when the caller is strict-exact). Claim hs_runtime first.
|
||||
|
||||
## why_new
|
||||
New first-party /Od evidence: I located the /Od function through the hs globals table ('debug_trigger_volumes' string 0x9810e0 -> global 0xc7de25 -> sole code ref at 0x606cbd, inside an aligned-frame function 0x606c80..0x607462; disassembly in scratch/w/triage_game_hs_net/od_trigger_volumes.txt). Earlier lanes believed no /Od body existed. It shows four things: (a) the points[1..3] tail is written separately in BOTH side arms (/Od does not cross-jump); (b) all 8 point computations are REAL point_from_line3d calls (fn 0x42e0d0) with t = 1.0 / 1.0 / 1.0 / -1.0 / 0.5 (floats decoded at 0x93dd5c, 0x9401b4, 0x93dd50); (c) the two string calls are an if/else; (d) sides[2] is zero-initialised. Two earlier lanes each measured half of this. The throughput lane's w7 duplicated-arm candidate is EXACT, and I re-gated it at f6d00a8c: still EXACT (scratch/w/triage_game_hs_net/w7_tv_now.obj). It was rejected only as 'duplicated arm stores (R2)' and it hand-expands the helper (rule 6). The 150K lane's w1 t6/t7 showed that the real helper fixes January's x87 operand order but not the frame layout. The combination, which is exactly the /Od shape, was never measured. Two premise checks: January's exact action_vehicle_find_destination inlines point_from_line3d(...,1.0f,...) with no 1.0 constant relocation, so VC7 folds *1.0f and the helper form can give January's add-only code; nodup_census shows _point_from_line3d has 24 SELECT_ANY definers and 0 NODUP, so emitting it is link-safe.
|
||||
|
||||
## prior_negatives_checked
|
||||
hs_runtime_obj_opus5_150k_w1 (t1-t7: sides[2], scoping, rename, helper -> 134 differing instructions or layout unchanged); hs_runtime_obj_opus5_250k_w3c (slot map, frame ranking fixed point; reopen criterion = a decode of the frame-ranking input, since met by the Lane C F3 decode plus this /Od evidence); throughput-recovery checkpoint_50k/75k (w7 EXACT but rejected under R2); park 82 (94.96%); small_unwritten_threshold_wave_main_hs_ai_20260913.
|
||||
|
||||
## notes
|
||||
Credit is the function only: hs_runtime stays incomplete because of begin_random (a tie) and 12 storage rows (see the ADMISSION row). If the helper form is not exact, the fallback is an OWNER question: w7's exact body with its duplication now /Od-attested but its point_from_line3d hand-expanded (rule 6). math/real_math is Codex-reserved; this route does not edit real_math.h, but the byte-identity check of the COMDAT should run after the Codex packet lands.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/hs/hs_runtime (storage: 12 converters)
|
||||
|
||||
## decision
|
||||
ADMISSION
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
Add `static` to the prototypes (hs_runtime.c:469-491) and definitions (around :1540-1660) of hs_long_to_boolean, hs_short_to_boolean, hs_string_to_boolean, hs_data_to_void, hs_short_to_real, hs_long_to_real, hs_enum_to_real, hs_real_to_short, hs_real_to_long, hs_long_to_short, hs_object_name_to_object_list and hs_object_to_object_list. symbols.json already marks all 12 `static: true`, and the split has storage 3, so no csplit regen is needed. Gate should confirm the change is byte-inert.
|
||||
|
||||
## why_new
|
||||
object_audit and pdb_storage show 12 storage 3/2 disagreements. All 12 are absent from the cachebeta publics, and they are the 10 NO-JANUARY-PROVIDER link_fail rows. They are referenced only through the conversion table inside hs_runtime.c (grep), so they are address-taken and a private ABI is impossible. No prior ledger addressed them: the round-1 hs storage packet covered hs.c only.
|
||||
|
||||
## prior_negatives_checked
|
||||
hs_runtime_obj_opus5_250k_w3c A1 static-linkage refutation concerns hs_global_data/hs_thread_data/hs_syntax_data (UNDEF externals), not these converters; round-1 hs ownership packet + review (hs.c only).
|
||||
|
||||
## notes
|
||||
Not measured. Triage made no candidate edits; the expectation of byte-inertness rests on the table-only references. Necessary but not sufficient for hs_runtime completion.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/interface/hud_draw
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.85
|
||||
|
||||
## route
|
||||
Owner ruling on the held 'hud_draw optimizer pragma': put a tightly bracketed #pragma optimize("", off)/on around fast_ftol_C only. The ai.c precedent is admitted. The 150k_w1 v2.c measurement gives _fast_ftol_C 56/0 EXACT, keeps _hud_draw_meter EXACT, and the whole-TU gate reaches 23/23. Two other fixes are mechanical: retire the stale candidate-only-comdat-owner rejection for _fast_ftol (round-1 provider_repair: actor_combat now emits ANY and all copies are identical), and nothing else blocks the object.
|
||||
|
||||
## why_new
|
||||
This is a new census, not a new byte route. build/split has exactly two non-16-byte code sections board-wide: _fast_ftol_C (56) and _ai_handle_spatial_effect (1130). build/base has exactly one of 8,918: ai.obj _ai_handle_spatial_effect (1130), and that function sits inside ai.c's #pragma optimize("", off) region. So code in an /Od region is the only thing VC7 leaves without nop padding. This corrects the n1 ledger's claim that ai had zero non-16 COMDATs, and it independently supports the CC-tail signature (150k_w1). The Sept-2001 map's 'i hud_draw.obj' flag and January's 12 out-of-line calls in hud_draw_meter are consistent with it.
|
||||
|
||||
## prior_negatives_checked
|
||||
hud_draw_obj_opus5_next150_n1 and n4: an __asm body at /O2 is 64 bytes and inlines into meter (1312 -> 1536); a naked form is still 64; position in the file is inert; (long) casts call __ftol2. hud_draw_obj_opus5_150k_w1 sec.4 and v2.c: the pragma route works. Round-1 provider_repair_source_interface_hud_draw, hud_stack_check and REVIEW__source_interface_hud_draw. Production checks at f6d00a8c: object_audit FAIL(2), both lines _fast_ftol_C; provider_link PASS; surplus_identity 2/2 IDENTICAL; pdb_storage 0 disagreements.
|
||||
|
||||
## notes
|
||||
If the owner approves, the object completes. Nothing else is outstanding: data, symbols and surplus all pass. I did not re-probe the held pragma, as the brief requires. Evidence is in scratch/w/triage_hud_interface/LEDGER.md and non16.py/non16b.py.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/interface/hud_nav_points
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. _custom_render_nav_point differs only in scheduling. My dis_range at 0x520-0x5a8 shows January emits `push 0` (override_scale 0.0f) before `mov eax,[ebp-0x10]; mov ecx,[ebp-0x14]`, and ours hoists both loads first.
|
||||
|
||||
## why_new
|
||||
Nothing new. The only known mechanisms that move a constant push ahead of region-head loads are a register conflict and a tail-merge IL block boundary. January has neither: no jump into +0x58c and no partner call.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn2_hud_nav_points custom_render: more than 30 prior shapes, 19 lab diagnostics, the /Od 0x62fcf0-faithful od1, dummy-local oracles and /G5-/G7//Ot//Og. hud_nav_points_obj_* ledgers, including the exhaustive census and complete_renderer_fuzzy_closeout.
|
||||
|
||||
## notes
|
||||
Even an exact body would still leave admission blockers (review4): consumer-local prototypes for objects.h, game_engine.h and units.h functions; opaque-span struct views hud_globals_definition and hud_nav_object_datum; float z_offset/vertical_offset. object_audit symbols: 0 differ.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/interface/interface
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
Apply round-1 production.patch + symbols_static.patch (research/fifty_objects_20260925/results/wave1/fn_interface_source_interface_interface.md, REVIEW approve=True). The six profile_* globals become external, as cachebeta publics show. interface_get_weapon_hud_index, render_debug_profile and interface_splitscreen_render become static, as HCEX and the absence from cachebeta publics show. The result is 18/18 strict, and object_audit passes after csplit regen. The owner must pick one of two header variants. Variant A removes the interface.h prototype and adjudicates a declaration-count tie loss in _rasterizer_frame_statistics_draw (4176 B). Variant B keeps the extern prototype over the static definition (C4211 at /W4).
|
||||
|
||||
## why_new
|
||||
Nothing new at the byte level. I checked the reopen criterion (c) arithmetic against January import tables. The genuine missing interface.h prototypes are interface_dispose and interface_dispose_from_old_map (imported by January game.obj) and interface_draw_fullscreen_overlays (render.obj). All three are weight-2 void prototypes. interface_get_rgb_color is PUBLIC but has no January importer. The profile_* globals have no importer in any other object, so there is no header-extern evidence. -3 + 2a + 5b = 0 has no solution, so no genuine packet balances the removed prototype.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 LEDGER: net -3..+44 oracle, where only 0 keeps rfs_draw; C4211/C89 analysis; review items (a)-(d), including 'do not apply the semantic_matches item 5'. interface_obj_* ledgers. Production object_audit FAIL(7) = the weapon_hud_index section + 6 profile_* storage rows; the patch is not landed.
|
||||
|
||||
## notes
|
||||
This is an owner pick, not more compiler work. Variant B has zero blast radius. On landing, retire the parked entry source/interface/interface:_interface_get_weapon_hud_index in the same change and edit symbols.json lines in place.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/interface/progress_bar
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None for _draw_gravy_layer (January name per the atlas: draw_layer_int), 352 vs 336. Frame (0x1c) and the 22-relocation multiset are identical. The whole gap is January keeping rect corners as live values with dead spill homes, while VC7 forwards rect.* memory operands in ours.
|
||||
|
||||
## why_new
|
||||
Nothing new at the byte level. I checked the atlas: the January-anchored jsonl names only draw_layer_int. Other builds show draw_layer and this_is_awful but give no January user for the PDB-static draw_gravy_screen_layer, which January emits with no referencing relocation in either tree. That fails reopen criterion (d).
|
||||
|
||||
## prior_negatives_checked
|
||||
progress_bar_obj_opus5_next150_n1: 6 shapes (named corners, pointer alias, nested block, rotation, aggregate copy, inlined helper). Round-1 wave1: about 25 more perturbations, including definition order, K&R/void* prototypes, casts, arrays, unions, __inline, register, dead stores and D3DDevice direct calls. The lab-only no-summary route has no source cause.
|
||||
|
||||
## notes
|
||||
Zero-credit admission debt for later: 24 D3D wrapper copies at progress_bar offsets (e.g. 855312, 856416) lack "static": true in symbols.json. Every other object's copies carry it (symbols.json 5591/5594/...), and the PDB has no publics for them, so the fix is in-place flags plus csplit regen. Also 5 Halo functions are PDB-static but external in ours, and there are atlas renames (draw_layer_int, do_convoluation_coords, draw_fade_layer, progress_bar_create_mask_texture) and the owner-gated _code_000d16d0 rename.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/interface/ui_widget
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. The five remaining rows are recorded ties. ui_check_for_pause_game: H2/H6 (/Od 0x664d00 plus the ui_widgets_active helper) reaches 672 [sha] with only an esi/edi swap; I re-confirmed this at f6d00a8c. launch_widget: every if/else, ?: and argument spelling pins -1 (my alndiff shows January's if/else diamond). display_scenario_help: ebx/edi tie. draw_bitmap_in_rect: store scheduling. render_recursive: R1 slot-home swap.
|
||||
|
||||
## why_new
|
||||
Nothing new. The /Od readouts for all six functions were already spent by the structural lane on 2026-09-23. For display_scenario_help and draw_bitmap_in_rect the /Od build is a 2020 rewrite.
|
||||
|
||||
## prior_negatives_checked
|
||||
ui_widget_obj_evidence_closeout_20260919, opus5_100k, opus5_150k_w1 and w3, house_clean, and the structural REPORT (H1-H6, L1/L2, R1-R5). Each residual has 5 or more measured shapes.
|
||||
|
||||
## notes
|
||||
Zero-credit storage debt: _global_ui_white_red, _global_ui_white_green and _global_ui_white_blue are January-static (absent from PDB) but ours are external. The structural candidate's fuzzy improvements (pause H6, poe P3, render R1) should land only together with an owner decision.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/interface/ui_widget:_widget_instance_process_one_event_recursive
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
Two changes: the structural-lane P3 body (/Od 0x668e50 topology) and the held dpad_event_times .bss split. The split is one symbols.json static entry at file_offset 4541104 (storage+0x870) plus a standalone `static unsigned long dpad_event_times[MAXIMUM_NUMBER_OF_LOCAL_PLAYERS][NUMBER_OF_DPAD_DIRECTIONS];`. The structural lane measured 97/5 with it (the function EXACT, no row lost).
|
||||
|
||||
## why_new
|
||||
I re-measured at f6d00a8c: structural candidate.c plus the one include canonical has added since gives exact 96 / residual 6. alndiff shows the only remaining difference in poe is January `lea eax,[edx+ecx*4-8]` with storage:2160 against ours `lea eax,[edx+ecx*4]` with 2128. The effective address is the same, so January's array is a separate object starting at storage+0x870. The name has no first-party source: HCEX _widget_globals has none, /Od has no dpad code, cachebeta has no public, and the atlas has no ui_widget data names.
|
||||
|
||||
## prior_negatives_checked
|
||||
ui_widget_obj_opus5_150k_w3 (split held under the invented .bss names ruling); opus5_100k; C:/halo-worktrees/claude-structural-20260923/scratch/lane/w/interface__ui_widget/REPORT.md (P1-P4, split measurement).
|
||||
|
||||
## notes
|
||||
This is the same held class as owner-queue item 2 (rasterizer_xbox .bss split with descriptive static names). Worth +2016 B. It does NOT complete ui_widget, because five tie residuals remain.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/interface/ui_widget_game_data_input_functions
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. _multiplayer_game_directions differs in the placement of one 0x11-byte return arm: January places the machine arm (0x22) after the player arm. The teams join-store fix (mgd_a) is already 122/122 instructions. _solo_level_select_list_update_displayed_items is a TU-wide declaration-count tie: period 64, a 2-name window at production+16/17. Its body is correct.
|
||||
|
||||
## why_new
|
||||
Nothing new. The /Od build lacks mgd (its assert string is absent). Closing solo needs January's genuine header set, and filler declarations are forbidden.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 LEDGER (research/fifty_objects_20260925/w/ui_widget_game_data_input_functions): mgd has more than 30 shapes across 3 lanes, a 73-analog layout scan, and a K=0..63 oracle that is never exact. For solo, the K-window measurements (r1, r3, p2) show January definition order is inert. Also fable_salvage, opus5_150k_w1 and 250k_w3c.
|
||||
|
||||
## notes
|
||||
The round-1 r3 storage packet is ready at zero credit and byte-neutral: January definition order, static callbacks, table and caches per HCEX and cachebeta, and a trimmed header. It fixes all 165 symbols, including the .bss swap of displayed_servers and build_version_wide_string, after 2 symbols.json renames and 41 static flags.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/interface/virtual_keyboard
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. _virtual_keyboard_select: the tail-merge survivor is the source-last arm in a flat switch. January's single `add eax,-0x24; cmp eax,7; ja` dispatch rules out every END-as-jump wrapper, because each one adds a compare (s3b). _virtual_keyboard_render_internal: six independent residual classes (-1 web split, key-IV base, loop-2 rotation, caret reload, font-header reload, csplit reloc alias).
|
||||
|
||||
## why_new
|
||||
Nothing new. /Od 0x68ef60 confirms select's arm order. /Od 0x68fa00/0x68fdb0 are a later redesign with no key grid.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn_virtual_keyboard select (e1-e30 labs, corpus survivors, s1/s3a-d, count oracle 1-32 inert) and render_internal (lab_pin1-5, r1, lab_style). virtual_keyboard_obj_* ledgers (fresh_graphs, 150k w1 and w3, residual one-shot, freshness audit). My alndiff confirms the select tail placement and the 0x2fa register swap (fixed only by the 'word buffer_size' lever, which must not land while the function is non-exact).
|
||||
|
||||
## notes
|
||||
Zero-credit storage debt: 4 symbols are January-static but external in ours (free_space_in_text_buffer, get_current_character, _virtual_keyboard_globals, _virtual_keyboard_key_layout). The relocs.json alias retarget _item_update_section -> _keyboard_rect+352 is needed once render_internal is exact.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/items/projectiles
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.15
|
||||
|
||||
## route
|
||||
_projectile_new (432 B) is strict exact (30/30, audit PASS) only when the initial_velocity load feeding the inlined point_from_line3d t-argument is parenthesised. The TU-private named-macro form `((definition)->projectile.initial_velocity)` is also exact. Owner ruling 2026-09-21 #4 treats a decoration-only parenthesis as steering unless the name is first-party-attested; none is known. The only open owner question is consistency with canonical's landed INFERRED named macro ai_debug_attractor_label_height (ai_debug.c:48-65, the same inline-then-call x87 lever) and the collisions.c:1572 precedent the owner said to revisit. Independent and landable now: the r1 semantic_data_matches entry for _projectile_update_section (1,548 B, 6 relocs, sha 7bfaf5fb..., allow_incomplete_unit) and the zero-credit rule-6 patch that replaces the hand-expanded point_from_line3d with the /Od-attested call.
|
||||
|
||||
## why_new
|
||||
No new first-party evidence. Canonical's ai_debug macro is precedent the r1 lane did not put to the owner. The provider blockers r1 listed (_distance3d, _real_random, _valid_real_vector3d_axes2 NODUP) are gone from today's hint packet: link_fail and surplus_different are empty. So the ruling is the object's only blocker.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 fn_projectiles_source_items_projectiles_projectile_new.md (P1-P14: casts, M8 extra locals, filler, folds x*1.f / TRUE?x:0, double t, local copies, parens on other operands; all inert except an outer paren on the load); projectiles_obj_evidence_closeout_20260919.md; projectiles_obj_opus5_pdb_ida_20260914.md; owner ruling #4 (memory owner-rulings-20260921-lane-b).
|
||||
|
||||
## notes
|
||||
Ready candidate: r1 lab_pfull.c / lab_localrhsparen.c. If the owner says no, RETIRE. The data entry alone is worth +1,548 credited data bytes now.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/items/weapons
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.45
|
||||
|
||||
## route
|
||||
The last function, _weapon_place (208 B), is strict exact only with the authentic `long` return. HCEX LF_PROCEDURE returns long in two PDBs; the /Od build reloads eax before its epilogue; January ends with mov eax,ebx. That long function is then bound to the void datum_place slot in object_types.c with a BUG comment. This is authentic-interface-bug class F from the Lane D owner queue, and the r1 reviewer placed a policy hold. A second owner item: the weapons_globals struct is invented. HCEX authenticates only blurred_permutation_names (LDATA char*[2]), so the profile_section static needs a descriptive name (weapon_update_section), which is a held naming class. Admissible now at zero credit: "static": true on 11 symbols.json lines plus static on weapon_magazine_finish_reload (prototype l.449, definition l.1382), then a csplit regen. After that, 78/79 and the audit shows only _weapon_place.
|
||||
|
||||
## why_new
|
||||
Checked today: the Sept-2001 cachebeta.map 'Static symbols' section, first-party. It lists weapon_trigger_get..weapon_reset, including weapon_magazine_finish_reload, as static FUNCTIONS, which independently corroborates the 11 static flags. It has no static DATA rows, so it cannot authenticate a name for the profile_section static. The literal 'weapon_update' at 0007:00037aa0 is only the section-name string. So the naming item still needs the owner.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 fn_weapons_source_items_weapons.md and REVIEW__source_items_weapons.md (approve=False: A long-return BUG, B descriptive name, C fallback not house-clean, D atomic data+csplit); weapons_obj_evidence_closeout_20260919.md; weapons_owner_packet_source_park_20260913.md; claude_lane_d_refresh_HANDOFF_20260922.md class F.
|
||||
|
||||
## notes
|
||||
On a yes, the object completes with packets p1+p2+p3 (p4, the action_charge real_random provider fix, appears to be in canonical already: link_fail is empty). The p1 data respell and p3 symbols.json lines must land atomically with the csplit regen. Re-gate the units sentinel _unit_preprocess_node_orientations after the weapons.h prototype change.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/math/geometry
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.02
|
||||
|
||||
## route
|
||||
Function-level owner items: (a) polygon2d, +1008 bytes. Lane D B3 is EXACT with the /Od 0x6bf170 body `dot_product2d((real_vector2d *)point, &plane->n) - plane->d`. Since geometry's local copy was removed (round-1 provider repair, landed), this is now a real_math.h header view cast: structural owner packet 20260923 decision (b), real_math.h reserved. R18 lab: collision_bsp shows 0 section differences with the header body. (b) hull3d_expand, +1808 bytes: h3e_c1 is EXACT only with the /Od pointer-before-range-check order, the January-bug/UB owner class (owner packet s4). Link blockers: _cross_product2d (owner queue item 1, P1, Codex-reserved) and _plane2d_from_points (decals NODUP; decals is closed for this lane).
|
||||
|
||||
## why_new
|
||||
Checked whether polygon3d has a caller-local route: /Od 0x6bd8a0 calls 0x56d580(plane, point), a real plane3d_distance_to_point call. So a caller-local dot_product3d spelling without the header's outer parentheses is NOT attested. The polygon3d tie stays header-bound.
|
||||
|
||||
## prior_negatives_checked
|
||||
Lane D REPORT (claude-lane-d-refresh-20260922/scratch/lane_d/w/math__geometry): polygon3d C2 is EXACT only with point_from_line3d plus the v3 header outer-paren removal, which LOST _decals_delete_permanent_from_cluster, _item_accelerate and _rasterizer_frame_statistics_draw. p3qD/p3eD M8 sweeps and v3a/v3b were inert. Also read: geometry_obj_opus5_150k_w3 rejected shapes, claude_collision_geometry_20260924, round-1 wave1/wave4 provider repairs and reviews.
|
||||
|
||||
## notes
|
||||
Object completion needs 2 rulings, P1, a decals provider repair AND the polygon3d header-paren tie, which trades exact rows. Not completable this round. The rulings alone would gain +2,816 bytes of function credit.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/networking/network_connection
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.4
|
||||
|
||||
## route
|
||||
The owner rules on two items: (1) _network_server_close_client_connection: the authentic N+1 capacity loop bound (MAXIMUM_NUMBER_OF_LOCAL_PLAYERS + 1, with a BUG comment), which the 2020 /Od build confirms (<0x11 with 16 slots); (2) _network_connection_connect: the redundant unreliable-arm `success = TRUE` (class H; owner packet s6 recommends rejecting it). cand_full gives 23/23 and object_audit PASS.
|
||||
|
||||
## why_new
|
||||
Nothing new. The /Od build has no unreliable path to attest the connect arm.
|
||||
|
||||
## prior_negatives_checked
|
||||
network_connection_obj_* ledgers (4); round-1 wave2 result and review (C1-C15 connect probes; P1-P3 bounds); claude_structural_owner_packet_20260923 s4/s6.
|
||||
|
||||
## notes
|
||||
The object completes only if BOTH rulings are yes. If connect is rejected, fall back to C2 (288/288, one block placement), which stays fuzzy.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/objects/damage
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
Stop here. _area_of_effect_cause_damage_to_object is 1 x87 kill-form difference from exact in the r1 patch-A body: January's `fxch st(1); fstp st(0)` against our `fstp st(1)` at +0x42e, which moves 2 bytes across the 16-byte pad (1312 vs 1328). Patch A's AOE form also needs the all-inlined COMDATs _collision_test_line and _real_random, admissible only from a strict-exact caller (ruling #5). Production AOE is further away: January tail-call-eliminates the self-recursion (jmp to an aligned loop head at 0x10), and the else-arm block order at 0x449 differs.
|
||||
|
||||
## why_new
|
||||
Nothing new. I decoded the +0x3e8..0x462 falloff block from January's bytes: normalize3d returns distance in st(1); radius_delta = outer-inner in st(0); then-arm scale = 1-(distance-inner)/delta, then delta is killed; the else-arm pops both and cross-jumps into the PIN upper-clamp `fstp; fld 1.0` block. This confirms r1's characterisation. It meets none of the r1 reopen criteria (a decoded C2 stackifier rule, a same-compiler donor, or authoritative source).
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 wave3 damage_source_objects_damage.md: 60+ probes covering arm order, compare spellings, variable reuse, statement splits, double types, aggregate members, extra references, extern switches, full-TU definition order, pragmas, filler oracle, name-count k=0..69, and the /Od ?:+PIN od2. killscan census: 36 fstp st(1) vs 3 fxch sites. REVIEW__source_objects_damage.md. damage_obj_opus5_150k_w3_20260914.md, damage_obj_area_of_effect_cluster_20260904.md.
|
||||
|
||||
## notes
|
||||
33/34; the body closed and landed with its storage fixes. Even an exact AOE leaves two admission items: the consumer-local `boolean unit_unsuspecting(...)` prototype (its owner header units.h is off-limits to this lane) and `extern boolean debug_damage;` (cachebeta public, no definer; same class as the render_debug (e) tentative definitions).
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/objects/object_lights
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.5
|
||||
|
||||
## route
|
||||
Owner queue item 4. Admit the surplus _object_get_bounding_sphere COMDAT that differs from action_vehicle's selected copy only in its two __FILE__ DIR32 targets, which point to January object_lights' own 33-byte c:\halo\source\objects\objects.h literal. That literal is the single unreferenced literal among 9,420 January literals, so it proves the discarded per-TU copy existed. Then apply the objlights_render_debug packet (OBJECTS_H_FILE define) and the _lights_section semantic_data_matches entry (1,541 B, 1 reloc, sha 527b43a1...). The data entry can land now with allow_incomplete_unit for +1,541 data credit.
|
||||
|
||||
## why_new
|
||||
Nothing new. The r1 data_gap ownership packet (4 statics) has already landed: the audit now PASSes. The single open item is the owner's rule-6 exception for an authentic per-TU __FILE__ difference.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 wave1 data_gap_source_objects_object_lights.md; r1 wave2 bounding_sphere_source_objects_object_lights.md; claude_fifty_objects_20260925_owner_queue.md §4; object_lights_obj_opus5_100k_waveD_20260914.md.
|
||||
|
||||
## notes
|
||||
43/43 functions exact; audit PASS; the only surplus mismatch is _object_get_bounding_sphere. Optional patch 07 (5 consumer-local debug externs made tentative definitions) is advisory only.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/objects/widgets/flags
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None. Lane D's S5 (the /Od-attested `short attachment_index_for_row = y_attachments[row];` as the first row-body declaration) is an optional zero-credit fuzzy improvement: 390/390 instructions, row EDX web gone.
|
||||
|
||||
## why_new
|
||||
I located the /Od flag_update independently at 0x797610. `odbuild file widgets\flags.c` gave accessors 0x7958d0/0x7959e0 and callers led to it; its RTC names are attachment_location through parent_vector, frame 0x3dc. Lane D had already used it. The /Od tail at 0x797f0c (`wsum = 1/wsum; new_position.x = new_position.x * wsum`) equals Lane D S11, which is inert. _flag_render_proper has been exact since cf097d7f, so the held `x * height` item is moot. Production gate: 15/16.
|
||||
|
||||
## prior_negatives_checked
|
||||
Lane D REPORT (claude-lane-d-refresh-20260922/.../objects__widgets__flags) S1-S26, including the S10 reuse form (every frame slot equals January but the tail becomes fmul [mem], 1168 bytes), S24/S25 division forms and d11/e11 filler diagnostics. Ledgers flags_obj_opus5_250k_w3c (A6/A33 scoping refuted), next150_tierB (width lens refuted), flag_update_credible_fuzzy_park_20260903 and render_counter_initializer_held_20260923 were also read.
|
||||
|
||||
## notes
|
||||
The residual is one F2 slot-merge membership difference. Reopen needs evidence of an extra IL reference to weight_sum, or a reuse spelling that keeps the `fld [r]; fmul st(1)` tail.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/objects/widgets/lightning
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.05
|
||||
|
||||
## route
|
||||
None for _lightning_submit (P2: a dependency-free `fstp st(0); mov ecx,[ebp-8]; fstp [esi+0xc]` reload/x87-store order; P1: the axis fallback needs the owner-gated aggregate view cast). Keep the park. The zero-credit storage correction is still pending and should land independently: round-1 scratch/w/lightning/storage.patch makes `static struct lightning_globals lightning_globals = {0};` and removes the extern from lightning.h. With it goes symbols.json line 23106 `"static": true` for _lightning_globals, then a csplit regen. pdb_storage at f6d00a8c still shows `_lightning_globals split 2 ours 2 PDB-public False`, and HCEX reports it as a File Static. The /Od shape edits (od_shape.patch) can go in the same zero-credit step.
|
||||
|
||||
## why_new
|
||||
Nothing new. P2 has no oracle anywhere in January outside lightning (w2 reload/store scan), and more than 100 statement, declaration, name-count and helper shapes were measured inert. Round-1 reopen needs BOTH an owner ruling on `up = *(real_vector3d const *)global_z_axis3d` AND a decoded C2 emission rule or a January source fragment. Neither exists. The Sept-2001 map names (lightnings_dispose, lightning_render, lightning_offset_marker_position) are already in symbols.json. tinfo confirms point_from_line3d is inlined (no out-of-line reference), so the Rule-6 COMDAT question stays tied to an exact caller.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 wave2 result and ledger (c1/c2, the 36+66 permutation matrices, /Od declaration orders and dead locals, name-count 0..40, forwarded colour, vertex_index TX2, u_offset+u, !vertex_index). opus5_150k_w2 (HCEX locals, add-esp oracle scan, reload/store scan: no site) and w3 (offset_marker_position closed via set_real_vector3d, 'S1-S16 / component-order / vertex-2 store permutations' do-not-repeat). credible_fuzzy_completion_20260902 and fable_salvage_reconciliation_20260902.
|
||||
|
||||
## notes
|
||||
The object stays 8/9. The storage packet is byte-inert: round 1 showed all 34 lightning.obj sections identical and all 20 widgets.obj sections identical. It is an admission prerequisite, not a credit gain.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/physics/breakable_surfaces
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.35
|
||||
|
||||
## route
|
||||
Two owner rulings stand between this object and completion. B1: land the /Od-attested named-local body of real_local_random in real_math.h. It adds one declared name to every includer, which loses _rasterizer_frame_statistics_draw (4,176 B, exact only at today's declaration count) and _bitmap_copy. B2: extend the bsp3d TU-local j+k association helper precedent to _breakable_surface_plane_distance, a 32 B static surplus that January's image does not have. Separately, an admissible zero-regression sub-packet is ready and has NOT landed at f6d00a8c: (1) delete the hand-copied breakable_surface_get_plane_from_designator (breakable_surfaces.c:54) and call bsp3d_get_plane_from_designator; (2) drop the per-TU '/Ow','/QIfist' override at config.json line 520, which makes the six helper COMDATs identical to January's selected copies; (3) add "static": true to symbols.json line 5362 (_breakable_surface_effect) and line 23116 (_globals, file_offset 4550316), then run a csplit-only regen. Packet: research/fifty_objects_20260925 w/breakable_surfaces_audit2/patches.
|
||||
|
||||
## why_new
|
||||
Nothing new removes B1 or B2. New today: the /Od build shows January's source had no header-body defect behind B2. /Od 0x7a0ca0 calls plane3d_distance_to_point(&s_plane/&t_plane, vertex_point) at 0x7a10bc, 0x7a10e8, 0x7a1119 and 0x7a1135, the same statement shape as ours. /Od 0x56d580 is dot_product3d(point,&plane->n)-d, and /Od 0x42dd80 is a left-associated i+j+k. Both are identical to real_math.h, so the j+k association is context-keyed codegen, not a spelling difference we can fix. B1 shares its victim with collisions (see the cross-cutting item).
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 wave1 audit_physics_rast_physics_breakable_surfaces.md; r1 wave2 breakable_surfaces_source_physics_breakable_surfaces.md: offsets -2..+5 all break frame_statistics_draw except 0; the only duplicate-prototype compensators are CRT, stack_walk (-2, still broken) and bitmap_delete (-2); the B24 outer-paren control was negative. Also breakable_surfaces_obj_opus5_150k_w2_20260914.md, breakable_surfaces_projection_provider_20260923.md, and owner queue 'held: breakable_surfaces B1'.
|
||||
|
||||
## notes
|
||||
12/12 functions exact; data complete. Object audit fails only on 2 storage rows, fixed by the symbols.json edit above. The remaining link failure is _real_local_random against the effects copy (header body pop ecx vs January add esp,4), which is B1. real_math is RESERVED for the Codex packet, so any real_math.h change must wait for or compose with that report. Ledger: scratch/w/triage_objects_physics/LEDGER.md.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/physics/collision_bsp
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.05
|
||||
|
||||
## route
|
||||
The three residuals split two ways. _collision_surface_test_sphere (880 B; frame 0x2c vs 0x24) is exact only with the unit-local SSE fast_distance_squared3d __asm macro, which the owner held on 2026-09-15: needs a ruling or authentic source. _bsp3d_test_sphere_recursive and _bsp3d_test_pill_recursive are RETIRE: they share an unexplained x87 term-order parity bit, and the pill also has a class-4 int/x87 interleave. The object also needs the RESERVED Codex P1 packet for _cross_product2d.
|
||||
|
||||
## why_new
|
||||
Nothing new. The geometry _plane2d_distance_to_point NODUP repair from r1 wave4 has landed (link_fail now lists only _cross_product2d).
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 wave4 collision_bsp_* (5 result files plus 2 reviews); collision_bsp_obj_opus5_150k_w2_20260914.md (SSE intrinsics i1/i2 measure 928 B, scalar C and inline refuted); Lane B collision_bsp_REPORT.md (50+ parity labs); collision_bsp_obj_sphere_cluster_20260904.md.
|
||||
|
||||
## notes
|
||||
27/30. Even on an asm yes, the two bsp3d parity residuals remain. The object is realistically not completable this round.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/physics/collisions
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.35
|
||||
|
||||
## route
|
||||
_collision_move_point (4,752 B) is strict exact in the genuine form: the real_math.h __inline valid_real_plane3d body (January inlines it at 0x485-0x4e8 and calls it out of line at case 1; /Od calls fn 0x6c7730) plus the /Od-attested function-scope `position`. That form loses _bitmap_copy (restorable by the genuine removal of the duplicate bitmap_delete prototype) and _rasterizer_frame_statistics_draw (4,176 B; no declaration count from -6 to +30 restores it). Owner question: accept the frame_statistics_draw loss (net +576 B code, +1 whole object), or hold. The rejected focused-header / block-scope packet must not be re-offered.
|
||||
|
||||
## why_new
|
||||
The provider blocker r1 listed is gone: decals plane3d_negate and path_obstacles point_in_sphere NODUP copies are absent at f6d00a8c (grep), and link_fail is empty. So the only blocker left is the frame_statistics_draw count canary, the same function that blocks breakable B1. One ruling unblocks both.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 fn_collisions_source_physics_collisions.md; REVIEW__source_physics_collisions.md (reject: scope steering against /Od and a one-consumer header; reopen (a) a genuine frame_statistics declaration fix, (b) an explicit owner ruling); collisions_obj_large_closeout_evidence_pass_20260919.md; Lane B try_13/try_22 (0x17b/0x17f preheader coin flip).
|
||||
|
||||
## notes
|
||||
real_math.h is shared with the RESERVED real_math unit. Compose with or wait for the Codex packet, and run the full 447-TU sweep. Integrator side items: the semantic_matches entries for jump-table under-credit (move_point 4752/226/8b2f29..., object_get_features_in_sphere 544/13/d5292109...).
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/rasterizer_geometry
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.25
|
||||
|
||||
## route
|
||||
An owner ruling on the round-1 candidate: a staged int-to-real conversion temp (`real value; value = (real)(long)(compressed<<21); v.i = (value*(1.0f/1048576.0f)+1.0f)*(1.0f/2047.0f); ...`, or t7 with /Od masks and divisions). It gives 19/19 EXACT, object_audit PASS, surplus identical, provider_link PASS and 0 pdb disagreements. If admitted: apply the round-1 production.patch (or t7), add the disclosure comment the reviewer required, retire the instruction-scheduling park, and flip the status. If rejected: keep the park.
|
||||
|
||||
## why_new
|
||||
No new route. January needs one code-invisible node in the fmul(i) scheduler filler group. The only spelling that supplies it is the conversion staged as its own statement, and the strip test fires on that. Round-1 review (approve=False) found the later /Od build (0x82ea80, frame 0x18 = v + RTC + GS cookie) has no scalar local and one store per component. It is not in the round-1 owner queue table, so it still needs to be escalated per the 2026-09-20 strip-test rule.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 ledger P0-P17: /Od masks and divisions alone, declaration-count 1..33, unused and live locals, the /G5-/G7 /GB /Op /Ot /Os /Oi /QIfist /arch:SSE flags, double intermediates (refuted by the dword-only __real relocations), cast/multiply/copy/struct/array/pointer spellings, and definition position (January 3rd). Park evidence: member-wise stores, operand orders, >>= folding, long-hand. Also the round-1 REVIEW, jonas_reconciled_closeout_20260901, and opus5_150k_w2/w3. HCEX lists only param `i` (enregistered scalars absent, so it cannot attest or refute). The Sept-2001 map shows the same neighbour order (int8, int32, get_vertex_size).
|
||||
|
||||
## notes
|
||||
Only one function (144 B) stands between this object and completion. The owner's choice is binary: admit the staged conversion temp with an inferred-construct comment, or keep the park. Staging is robust: every natural staged form (t4-t9) is EXACT and every unstaged form measured is residual.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.35
|
||||
|
||||
## route
|
||||
Owner-queue item 2 (research/fifty_objects_20260925/w/owner_queue/names_xbox_hs_scen, patches 01-05, apply-ready). The only blocker is the 9 non-first-party .bss static names. New partial evidence: HCEX.pdb's target enum (DIA2Dump -t, values 0..9: render_d3d, render_primary, render_secondary, shadow_primary, shadow_secondary, motion_sensor_primary, sun_glow_primary, sun_glow_secondary, water, z) ends with `_rasterizer_target_z`. January's 8th target (after water) is the render-primary descriptor whose Data is global_d3d_surface_render_primary_z->Data, i.e. the Z-buffer target. So names #8/#9 (`*_render_primary_copy`, currently INVENTED) can become HCEX-enum convention stems such as global_d3d_{texture,surface}_z, and the tree enum `_rasterizer_target_water_bumpmap` can take HCEX's `_rasterizer_target_water`. This offers the owner a better-evidenced name set. It does not remove the ruling: node_matrix_constants stays invented, and #2-#7 stay convention stems.
|
||||
|
||||
## why_new
|
||||
Round-1 RULING.md checked HCEX for `_rasterizer_target_render_primary` but did not use the full enum. The `_z` target identity for the 8th slot is new. No other first-party names turned up: the January-hash atlas and the Sept-2001 map-tier atlas files list only rasterizer_xbox.obj functions, and the PC DX9 /Od build uses a global_render_targets[] array with no node_matrix, secondary_z, bitmap_dimensions or _copy strings.
|
||||
|
||||
## prior_negatives_checked
|
||||
claude_fifty_objects_20260925_owner_queue.md item 2, names_xbox_hs_scen RULING.md/MEASURED.md, review2_rasterizer_xbox REVIEW.md (approve=false only on owner policy), owner-rulings-20260915 (no descriptive static names), 2026-09-24 canonical path_obstacle_avoidance hold.
|
||||
|
||||
## notes
|
||||
95/95 exact. The packet gives audit PASS, provider_link 15/15, storage 216/0. The 05_parked.json re-baseline for models __rasterizer_model_draw still applies. The independent rasterizer_xbox_debug static-wrapper patch is not name-gated. Evidence: LEDGER.md P1, P14.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_environment
|
||||
|
||||
## decision
|
||||
ATTACK
|
||||
|
||||
## est_probability
|
||||
0.25
|
||||
|
||||
## route
|
||||
Close _rasterizer_environment_specular_spot_light_begin (960 B) using the /Od shape, then fix ownership. (1) Replace the three separate real_vector3d locals with `real_matrix4x3 light_matrix` (name from the /Od RTC descriptor 0x7e4968: [ebp-0x40] size 52 'light_matrix', and HCEX). (2) Add the /Od-attested named scalar for radius*0.5f (/Od [ebp-0x50]), so cone_scale = 1.0f/(radius - half) and vertex_constants[4].l = -cone_scale*half. In the lab this removes the extra fxch at 0x1ea and the whole tail cascade: n3a's s1 had 28 alndiff hunks, this has 15, and instruction count is 248 on both sides. (3) M8 oracle: two initialised dead locals (D=2, period 8: D=10 and D=18 behave the same) make all three cross_product3d j/k x87 flips at 0xf3..0x116 match January, so that residual depends only on the IL local count. The attack must find a genuine source construct that is +2 mod 8. The fillers are only the instrument. (4) What is left at D=2 is one register rotation: eax/ecx/edx in the light->definition/position copy at 0x12d..0x154, plus lea ecx vs edx at 0x1b5/0x1bd. Measured inert for it: the M8 count, H3 pre-function externs (1..16), /Od declaration order, radius operand order, and a flat real[20] constant array. Moving the position copies first is refuted, and so is a `definition` pointer local (242 insns). Whole-object prerequisites: symbols.json `static:true` on 6 XDK wrappers plus _rasterizer_environment_specular_spot_light_begin; `static short specular_light_vertex_shader_permutation_index` (cachebeta non-public; measured with 42 exact kept); `#define/#undef REAL_MATH_EXTERNAL_NORMALIZE3D` (precedent ai.c:201/244; measured 42 exact kept and the Rule-6-violating _normalize3d surplus is gone; env is the only one of 60 definers whose copy differs from January's action_charge copy). A genuine shared-declaration packet is also needed for the 17 TU-local struct views and 4 consumer-local externs. __rasterizer_environment_lightmap_draw needs a separate owner/reviewer call (see notes).
|
||||
|
||||
## why_new
|
||||
No env ledger ever read the /Od function 0x7e4590, rasterizer_dx9_environment_specular_light.c (grep for 7e4590 over docs/ and research/ finds 0 hits). It shows the separate half-radius local and a non-nested normalize3d(&light_matrix.left). The only M8 corpus sweep of this row (mod8corpus*.jsonl) ran on the old parked 944-byte body. That body reads frame-local copies, which M8 does not govern, so its INSENSITIVE verdict says nothing about the frame-exact light-relative shape. The measurement here is the first to show that the n3a 'x87 commutative leaf-age tie, needs a law or a real_math.h change' is count-governed. It also refutes M8's 'j/k never move' clause for cross_product3d's mixed bare/offset products.
|
||||
|
||||
## prior_negatives_checked
|
||||
rasterizer_xbox_environment_obj_opus5_next150_n3a/n4_20260915 (frame closed with real_matrix4x3; argument order, operand addresses and struct-copy schedule are pinned; the R3 fxch swap is forbidden), 250k_w3c, 150k_w1, 100k/waveC, lightmap_draw_fuzzy_20260912, opus5_next150_research_campaign_20260916 Tier C row (949 B), the mod8corpus rows (parked body, INSENSITIVE), astra_90pct_research7_environment + independent review + environment-topology-followup (lightmap HOLD), parked.json park evidence.
|
||||
|
||||
## notes
|
||||
Evidence and lab files: scratch/w/triage_rasterizer_b/LEDGER.md P4-P9, P13, P15; lab/mk_spot.py, lab_od*.c, lab_odz_d2.c; od_0x7e4590.txt. All lab files are oracle/diagnostic only. 0.25 is the probability of closing spot_light_begin. Whole-object completion also needs __rasterizer_environment_lightmap_draw. The astra 0920 candidate intensity.c is already STRICT EXACT (4016/248, sha 7818e559) and its /Od-attested 1.0 intensity factor is accepted. It is HELD because the duplicated per-arm stage-0 MAG/MIN/MIP blocks have no independent witness. I searched further: the Oct-12-2001 2276betaP.xbe lightmap_draw (0x1612be..0x161356) has the identical merged tail and scheduling, and 2276P, 2276defaultP and default.xbe are assert-free release builds. So no Xbox build we hold is a witness, and this part is OWNER (the reviewer's evidence standard). Object-completion probability is about 0.08.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_environment_fog
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
No function route. __rasterizer_environment_fog_screen_begin (3904 B) cannot be closed with admissible source. The best diagnostic (candidate_diag_DE_R3.c) needs owner rulings D (in-place `*(long *)&x` float-bit reads in the five %f[%x] dumps), E (dot_product3d point->vector view cast) and R3 (a new _set_real_point2d COMDAT from a non-exact caller). Even with all three it gates [sha] with 197 alndiff hunks at f6d00a8c. Frame +4 (vector merging into the double-temp entry) and more than 10 order/register residuals have no source form. Object-level items remain valid for when the function reopens. 7 XDK wrapper symbols.json `static:true` rows (round-1 packet; cachebeta non-public). _real_local_random link/Rule-6 failure: new lab fact (P11). The header spelling `real result= real_seed_random(...); return result;`, the same form as effects.c:1398 and the header sibling real_local_random_range, emits a COMDAT section_infos_equal to January's selected effects.obj copy. A real_math.h packet could therefore retire effects' NODUP hand copy and the 3 differing surpluses (env_fog, weather_particle_systems, breakable_surfaces). It is a shared-header body respelling (LAW I canary risk) and real_math is reserved to the Codex packet, so it is for the integrator/owner.
|
||||
|
||||
## why_new
|
||||
Only one thing is new for the function: an M8 dead-local oracle, never run on this row before, is INSENSITIVE (D=1..7 all 197 hunks). That closes the one decoded-law avenue round 1 had not tried. The _real_local_random byte-identity result is a new object-level fact, but it does not close the function.
|
||||
|
||||
## prior_negatives_checked
|
||||
research/fifty_objects_20260925/w/rasterizer_xbox_environment_fog/LEDGER.md P0-P22 + FINAL (do-not-repeat list: L_* loop ablations, g2-g6, a9d/a10d, R2, s4, f1d, m1-m3, p1-p2, q1d), structural lane REPORT.md, opus5_100k/150k_w1 fog ledgers, four_function_reaudit, window_owner_reconciliation, owner-rulings-20260915 (D/E-type items not granted).
|
||||
|
||||
## notes
|
||||
Canonical f6d00a8c has NOT landed round 1's zero-credit c8 production.patch. That patch fixes the shadowed previous_camera_matrix uninitialised read plus other fidelity items; unmatched instructions go from 277 to 105 and there is no new COMDAT. The integrator may still want it as zero-credit hygiene. Reopen if the owner grants D+E(+R3) AND a decoded C2 rule explains the vector/phase/point frame overlay. Also 12 TU-local struct views, 6 reserved spans and 2 consumer-local externs block admission independently. Evidence: LEDGER.md P11, P12; lab/lab_fog_rlr.c.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_hardware_bitmaps
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
None for _rasterizer_bitmap_new. The residual is one jne displacement at +0x15A: January binds it to the epilogue after the error() block (0x171), we bind it to the byte-identical clone after the no-device block (0x17e). Keep the park. Zero-credit hygiene the integrator may take whenever the object is next touched: rename 0x158120 _rasterizer_bitmap_cube_map_changed -> _rasterizer_bitmap_cm_changed (2001-09-25 cachebeta-xbe map 0x166dd0, anchored with delta 0xECB0); remove the consumer-local prototypes texture_cache_bitmap_delete (l.101) and rasterizer_error (l.103) and the consumer-local `extern D3DDevice *global_d3d_device` (l.116) in favour of the owner headers.
|
||||
|
||||
## why_new
|
||||
Nothing new. The two returns (the no-device return TRUE, emitted as mov al,bl from the ebx=1 pin, and return success) merge on VALUE, and the canonical block follows the layout-last fall-through predecessor. Round-1 reopen criterion (a) needs a return that is IL-distinct but byte-identical. The candidates I checked (return success on the ND path, return !global_d3d_device, hw==NULL) either constant-fold to TRUE and merge again, or emit different text. There is no new first-party source: /Od 0x7ea7d0 is the dx9 rewrite, and HCEX is a PPC rewrite with no locals.
|
||||
|
||||
## prior_negatives_checked
|
||||
Park evidence (>50 control-flow shapes). opus5 crossjump-epilogue R3-R8 (38 whole-TU spellings, 24 case orders, declaration count 1..32). Lane C block-selection FINDINGS (~30 probes incl. A3/A4 single exit, er/els early guard, m1). Round-1 wave2 a1/a2 (/Od arms regress to 432 B), a4, t7/t7b (/FAsc: ND sunk but the canonical still follows ND), s1. The 33-instance FIRST-binding corpus study. The block-selection-is-source-reachable and tail-merge laws (value-specialised return text is the only known lever, and it does not apply here).
|
||||
|
||||
## notes
|
||||
Stop rule has fired twice (the park and round 1). The object has no other blocker besides this function and the hygiene above. The XDK header tables (D3DPRIMITIVETOVERTEXCOUNT etc.) would need the surplus_identity/provider_link audit if the function ever closed.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_hardware_geometry
|
||||
|
||||
## decision
|
||||
ADMISSION
|
||||
|
||||
## est_probability
|
||||
0.85
|
||||
|
||||
## route
|
||||
Land the owner-queue option B packet as it stands: research/fifty_objects_20260925/w/owner_queue/pick_hwgeom_models/patches/hwgeom_B/{01_rasterizer_xbox_hardware_geometry.c.patch, 02_symbols.json.patch, 03_config.json.patch}. `git apply --check` is clean for all three at f6d00a8c, the .c file has not changed since cdc8ebd3, and symbols.json rows 5813-5825 are unchanged. The packet: (1) deletes the six hand-written stubs code_00158450/460/470/4b0/4d0/510; (2) adds `D3DVertexBuffer_MoveResourceMemory(d3d_vertex_buffer, D3DMEM_VIDEO);` after the vertex-buffer Unlock block, with a disclosure comment; (3) edits symbols.json in place: 0x158450 becomes _D3DResource_MoveResourceMemory@8, 0x158460 becomes _D3DVertexBuffer_MoveResourceMemory@8, the four Unlock stubs get their XDK names, and "static": true goes on all 13 XDK wrapper rows (cachebeta publics: none of them is public; pdb_storage shows 13 disagreements today); (4) regenerates csplit (only this .obj changes) and flips the status to Matching. Round 1 measured B as 17/17 EXACT, object_audit PASS 25/0, 0 pdb disagreements, provider_link PASS in both orders, fake scan 0. Integrator: full ninja plus a stable sweep.
|
||||
|
||||
## why_new
|
||||
Round 1 sent this object to the owner (queue item #7) because 'No first-party evidence names the spelling'. Its E1-E9 evidence never used the tier 'map' records in the Halo symbol atlas. Those records are MSVC linker-map ground truth from 2001-09-25. Atlas 6455066470... (retail cache exe) and 7eacac85... (cachebeta xbe) both list, in lib rasterizer_xbox_hardware_geometry.obj: _D3DResource_MoveResourceMemory@8 (0x504f10 / 0x167100), then _D3DVertexBuffer_MoveResourceMemory@8 (0x504f20 / 0x167110), then _D3DVertexBuffer_Unlock@4, and on through the same Unlock/Lock names. In the cachebeta xbe the spacing is the same as January 0x158450..0x158510 (the Release/Lock gaps included). So option B is attested by first-party name evidence and option A (IDirect3DResource8_) is refuted for the Sept-2001 ancestor. The hg0 Unlock names are attested the same way. This takes the A-vs-B pick away from the owner.
|
||||
|
||||
## prior_negatives_checked
|
||||
The round-1 wave2 result and ledger (E1-E9 census, the 10-placement probe matrix, and the conclusion that spelling, placement and argument cannot be recovered from the bytes). Owner queue section 7 (evidence for/against, measured audit of A and B). The APPLY_ORDER.txt packet notes. hints.json: no parks and no rejections. pdb_storage on the current production shows 13 disagreements (7 XDK wrappers + 6 _code_ stubs, all external where January has them static). January's own atlas (4cc87b45) has no record at 0x558450/460 because of the exact-tier size floor.
|
||||
|
||||
## notes
|
||||
The remaining disclosure item is small: the D3DMEM_VIDEO argument and the call's position are byte-inert and unattested. The call's existence is proven by January's emitted static wrapper (static-COMDAT law), and the patch comment discloses the rest. The Sept-2001 cache-exe layout differs slightly in the index-buffer wrapper sizes (IDirect3DIndexBuffer8_Lock 0x10 vs January 0x20), but the cachebeta-xbe map has January's exact spacing. Evidence is logged in scratch/w/triage_rasterizer_a/LEDGER.md (P1, P7).
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_lights
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.3
|
||||
|
||||
## route
|
||||
Two owner choices, from round 1. (1) Admit cand_g2_diagnostic_R15.c: the vector_from_points3d return pointer plus the 3-statement brightness accumulation, previously rejected under R15. It gives STRICT EXACT 14/14, object_audit PASS, 7 identical COMDATs, provider_link PASS and 0 pdb disagreements. (2) Waive Rule 6's caller-exact condition and land cand_g4.c (the /Od-attested vector_from_points3d/normalize3d/dot_product3d/point_from_line3d shape) as a zero-credit fuzzy re-baseline. For EITHER option, the TU must also replace its consumer-local `extern struct rasterizer_lights_window_parameters global_window_parameters;` (line 187; a view with reserved02/20/3C/A0 opaque pads) with the genuine rasterizer.h:250 `struct rasterizer_window_begin_parameters` (camera/frustum members), and re-gate. That is a section-9 admission blocker that round 1 did not name.
|
||||
|
||||
## why_new
|
||||
No new byte route. The residual is the term/operand order of one commutative x87 dot (January i,j,k local-first; g4 i(global-first),k,j). Round-1 bisect, esearch and oracles show it is keyed by function-wide IL content that does not appear in the bytes. I checked the /Od premise for an M8 local-count route: 0x7edb90 is a 4950-byte DX9 rewrite (frame 0x1c0, extra dx9 state calls), so its scalar-local census does not transfer. What is new: the consumer-local window-parameters view is a separate admission blocker. Round 1's tusweep varied only the declaration COUNT, never the genuine type, so switching to it is required hygiene. It could in principle move the dot, but the premise is weak (the field offsets are identical).
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 ledger: g1/g4/g5/g6/g7/n1/n4/n5/va/r1/r2/sc/q1/q2, dead-long oracle K=0..28 at four positions, the tusweep 1..40, the esearch dead-read oracles, the bisect L=34..327, the micro lab, and the corpus scan_ijk. opus5_150k_w2 (scoping fixed the 0x98 frame; 20+ single-expression dot spellings) and w3 (V1/W1 rejected under R14/R15/R16). opus_reconciliation_20260903. The Rule-6 exception text in docs/campaign_house_rules.md. The parked.json evidence is stale: it says frame 0xA4 vs 0x98, but production is already 0x98.
|
||||
|
||||
## notes
|
||||
The Sept-2001 map names (rasterizer_project_billboard, sun_glow_copy_source, sun_glow_convolve, sun_glow_draw) already match. The genuine-struct switch touches rasterizer_project_billboard's projection_matrix and world_to_view accesses too. Measure it once on g4 (it might move the dot) and once on g2 (it must stay exact) before any owner packet. Other local structs (pixel_shader_definition, lens_flare_definition, rasterizer_lens_flare_submit_parameters) should be checked for owner headers in the same pass.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_models
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.04
|
||||
|
||||
## route
|
||||
No admissible route. __rasterizer_model_draw (5168 B) needs F1, a zero-code conditional region around the self-illumination subtract_vectors3d site that January's bytes cannot recover (lab-equivalent forms if(TRUE)/if(shader_model)/if(shader) are invented conditions). It also needs the /Od casts in a non-exact caller and then H3/M8 ties at 0x1da, 0x5f9, 0xa17, 0xdf9 and 0xf6d. _rasterizer_model_draw_environment_shader (3104 B) needs set_real_vector4d moved into a shared header. That is the P1 class (new header COMDAT from a non-exact caller; the only provider is env_fog's non-exact screen_begin), plus the ALPHATESTENABLE edi and edi/ebx allocation ties.
|
||||
|
||||
## why_new
|
||||
Nothing new closes it. New negative: the Oct-12-2001 2276betaP model_draw (entry 0x16c5a0, same +0x218/+0x5af assert layout as January) has the identical untested subtract(0x13090)/periodic/point_from_line3d(0x12f80) sequence at 0x16cb62..0x16cba4, so no earlier Xbox build reveals the folded F1 condition.
|
||||
|
||||
## prior_negatives_checked
|
||||
research/fifty_objects_20260925/w/rasterizer_xbox_models/LEDGER.md (c1-c9, d1/d3, f1-f3, g1-g6, L_* lab, o/u/f/s oracles, e_*, do-not-repeat list), results/wave4 REVIEW files, rasterizer_xbox_models_obj_opus5_100k_waveC/150k_w1/150k_w3/opus_reconciliation ledgers, parked.json evidence for both parks (instruction-scheduling, tu-context-optimization), P7 hud_draw.h include note.
|
||||
|
||||
## notes
|
||||
Reopen only if (a) first-party evidence names January's condition around the self-illumination block, or the owner rules on it, and (b) env_fog screen_begin becomes exact, which unlocks the set_real_vector4d header move. The round-1 landable zero-credit g6 (draw 95.08 -> 95.71, env 95.87 -> 96.39) and the 5 wrapper-storage symbols.patch remain integrator options. TU-local views (16 structs, 26 reserved spans, 4 externs) and the C4013 frame-statistics prototype also block admission. Evidence: LEDGER.md P10; oct_betaP_model_draw.txt.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_profile
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.2
|
||||
|
||||
## route
|
||||
Three owner rulings from review3 (REVIEW__source_rasterizer_xbox_rasterizer_xbox_profile.md). B1: de-aggregate the four invented TU-private structs (pad02/pad06/pad12/pad16/reserved06[6]) into loose statics with descriptive .bss names (held class). This is exact except an unattested 4-byte .bss object at +0x45c. B2: admit the /Od-attested NONE-branch '### PROFILE: %s -- tell Bernie!' varargs defect (BUG class, /Od 0x8004c0; 08 BUG-marker patch ready). B3: confirm the three load-bearing volatile qualifiers (stripping them gives 12/16). The zero-credit ownership patches 01-06 + 08 + 07R rejection rewrite are ready. The 132-byte .data is the objdiff 3.3.1 '$' defect; the pinned semantic_data entry lands only with the Matching flip.
|
||||
|
||||
## why_new
|
||||
Nothing new. HCEX has no profile TU statics (review3 V10), the /Od .bss map was already read, and none of the checked sources gives a first-party name for the +0x45c object.
|
||||
|
||||
## prior_negatives_checked
|
||||
results/wave3 xbox_profile + REVIEW, rasterizer_xbox_profile_obj_* ledgers (bss_attestation, remaining_boundary, shared_owner_reconciliation, data_accounting_audit), config/object_admission_rejections.json entry (candidate-only-comdat-owner _D3DSIMPLERENDERSTATEENCODE; SDK tables resolved by review3).
|
||||
|
||||
## notes
|
||||
Canonical f6d00a8c still carries the consumer-local `extern ... global_window_parameters` at profile.c:238. The reviewed zero-credit 01-06 window/API owner patches have not landed. 16/16 exact, audit PASS. Evidence: LEDGER.md P3.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/render/render_cameras
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.02
|
||||
|
||||
## route
|
||||
None. Two zero-credit packets exist: production.patch (house-clean, 94.3%, applies cleanly at f6d00a8c) and production_owner_gated.patch (98.7%, 3376/113, frame 0x6c). The second needs an owner ruling on the `*(long *)&camera->vertical_field_of_view` bit read. Neither is exact.
|
||||
|
||||
## why_new
|
||||
New probe: HCEX DIA2Dump -sym render_camera_build_frustum lists only aggregate locals: z_axis, y_axis, x_axis, viewspace_plane, viewspace_normal, frustum_midpoint, frustum_vertex, clip_plane. That is the /Od RTC set minus projected_bounds. It gives no scalar or inline inventory, so reopen criterion (b), the +1 IL symbol before CP1, is not supplied.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn2_render_cameras, about 300 compiles. 15 REAL regions remain. CP (one M8 hunk) is solved only by an unattested (u,b)=(1,7). W-core is 14 dependency-free placement hunks (`mov eax,imm` at checks 5/10/15/21, plane-pointer reloads). They never moved under u 0..31, b 0..7, a 64-combo /Od toggle matrix, counter type, casts, inventory or helper definition order. The stop rule fired. Ledgers large_closeout_evidence_pass_20260919 and frustum_natural_reconstruction_20260913 were also read.
|
||||
|
||||
## notes
|
||||
W-core does not depend on CP, so even an owner yes on the cast leaves the function residual.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/render/render_debug
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
Owner queue item 5: rule (d), the invented render_debug_globals_definition aggregate with opaque_after_* pads. D1 = seven `= 0` descriptive statics plus symbols.json rows; D0 = admit the aggregate as it is. Then apply packet research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/patches in this order: 05 (genuine point_from_line3d calls, /Od-attested at 0x84a920/0x84a510/0x848640; genuine vehicle_datum plus a vehicle_datum_try_and_get macro; dead REAL_MATH_EXTERNAL defines removed), 06 (tentative `boolean debug_*` definitions, COMMON-pool evidence), 08 (status flip).
|
||||
|
||||
## why_new
|
||||
Verified at f6d00a8c: none of 05/06 has landed. render_debug.c still has vehicle_runtime_datum at l.200-312, REAL_MATH_EXTERNAL_* at l.135-137 and extern debug_* at l.355-360. `git apply --check` exits 0 for 05, 06 and 08. January's render_debug strings ("render debug cache overflow.", "...string overflow", "can't add box2d to debug cache") name no cache variable, so there are still no first-party names for D1.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 audit_path_render, provider_repair and review_admit2 (36/36, audit PASS, pdb 0, link PASS). Owner queue item 5 evidence: an uninitialised-static layout lab fails the audit, so the `= 0` initialisers are layout-proven. The Layer 2 project_point2d blocker is already resolved in production (provider_link PASS here).
|
||||
|
||||
## notes
|
||||
The probability is conditional on the owner answering D0 or D1. Everything else is apply-ready and needs no further ruling, apart from integrator confirmation of 06.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/structures/structures
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.9
|
||||
|
||||
## route
|
||||
Owner ruling on the inferred `double t = -plane_distance;` in _sphere_intersects_cluster_portal. On yes, apply research/fifty_objects_20260925/w/structures/production.patch (git apply --check exit 0 at f6d00a8c). If admitted, add the in-source inferred-construct disclosure comment, per the 2026-09-20 actor_perception precedent. On no, keep the /Od-attested fallback s2_inline_neg at zero credit.
|
||||
|
||||
## why_new
|
||||
New measurement at f6d00a8c. The round-1 object blocker is gone: provider_link on production structures.obj now PASSes, because the path_obstacles and decals NODUP conflicts were fixed by round-1 provider packets. I re-gated round-1 final.c (copy in scratch/w/triage_camera_render_fx/structures_r1_final.c): exact 17/0/0, object_audit PASS, provider_link PASS. The double-t ruling is therefore the only remaining blocker, and a yes completes the object now.
|
||||
|
||||
## prior_negatives_checked
|
||||
Round-1 fn_structures and REVIEW. Strip tests S1 (`real t`) and S2 (inline negate, the /Od form) are residual with the same three one-slot moves. /Od 0x8a07bb negates inline and has no t slot. P01-P03, dead-local k=1..7, TU declarations k=1..16, alias locals and TG3 (outer double) were all inert or wrong-frame. Precedents: actor_moving.c:2136 and units.c:11087 double temps. Ledger structures_fog_inline_closeout_20260923 was also read.
|
||||
|
||||
## notes
|
||||
The probability is conditional on a yes. Owner-class argument: the strip test fails and the construct is contradicted by the later /Od build, but January's schedule is explained by a per-use double-to-real conversion node, the units throw_grenade_release lever. The fallback avoids the hand-expanded point_from_line3d (rule 6) either way.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/text/draw_string
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.85
|
||||
|
||||
## route
|
||||
Owner ruling on the January-bug class for _bitmap_draw_string: January's inverted `if (!bounds)` test followed by bounds-> reads, a NULL dereference. Round-1 cand1/cand2 give 28/28 strict, and the /Od-attested valid_format flag form is byte-inert. Separately, the ownership packet can land now at zero credit: ownership.patch + symbols_json.patch split the invented _draw_string_globals into four HCEX-attested file statics with = { 0 } ordering. With both, final_full.c passes the full audit against a simulated split.
|
||||
|
||||
## why_new
|
||||
Round 1 already added the /Od corroboration: fn 0x8b2090 has the same inverted test and the RTC names adjusted_bounds/adjusted_clip. I verified here that the ownership packet has not landed: symbols.json line 23279 is still _draw_string_globals, and pdb_storage shows 1 disagreement.
|
||||
|
||||
## prior_negatives_checked
|
||||
The park evidence says no safe expression yields the absolute reads at 0..6 without a relocation. Round-1 fn_draw_string wave1 (both units). draw_string_obj_* ledgers, including opus5_next150_n1 and lane D group J, list it as an owner ruling.
|
||||
|
||||
## notes
|
||||
This is the held January-bug class from brief sec.8 (NULL dereference). Report only; do not land without approval. The bug body must carry a BUG (original) comment.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# source/tool/connected_geometry
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.03
|
||||
|
||||
## route
|
||||
Function-level owner items from Lane D (claude-lane-d-refresh-20260922/.../tool__connected_geometry). (a) _connected_geometry_find_or_add_edge (240 bytes) is EXACT with an uninitialised `boolean direction;`, attested by /Od 0x8bb620 _RTC_UninitUse("direction"). This is the January-bug class; structural owner packet s4 proposes admitting RTC-attested rows as a class. The admissible fallback costs 1 instruction. (b) _connected_geometry_find_or_add_vertex (192 bytes) is EXACT via the TU-local realcmp_epsilon macro, verbatim from sound_dsound_xbox.c:61. It is not January-string-attested; the 2026-09-20 actor_perception inferred-macro precedent may apply.
|
||||
|
||||
## why_new
|
||||
Nothing new. Current state: 7/10 (add_triangle is exact since the n4 ledger).
|
||||
|
||||
## prior_negatives_checked
|
||||
triangle_coplanar: n4 (0915) and Lane D c1/c2 sweeps, M8 0..8, and a paren-count map (FP paren nodes mod 4). January's yzx/ikj lies in neither measured cycle; the best is 6 instructions and only with the unattested macro, and the stop rule fired. n4 e1-e5 covered the edge block swap before Lane D's ternary tail fixed it.
|
||||
|
||||
## notes
|
||||
triangle_coplanar (384 bytes, parked) is a RETIRE-level tie, so the object cannot complete even with both rulings. The rulings are worth +432 bytes of function credit.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/units/bipeds
|
||||
|
||||
## decision
|
||||
RETIRE
|
||||
|
||||
## est_probability
|
||||
0.02
|
||||
|
||||
## route
|
||||
Retire all nine residuals from this lane except one owner item. _biped_check_discard (176 B) is strict exact with January's argument/format-mismatched error() varargs (describe-actor pushed first). /Od 0x8bdd20 shows the same order, so this is an authentic January bug and belongs to a held class; it needs an owner ruling (ready: structural-lane ruling_check_discard.c). The other eight are recorded stops: update_moving (alias-driven pipelined struct copies, mechanism unknown), update_physics (collisions[-1] OOB read held plus 284 regions), update_turning (casts need ruling-6 strict exactness; 3 leaf swaps remain), sight_position (needs the inline point_from_line3d that the REAL_MATH_EXTERNAL define blocks, and _biped_update_jumping needs that define), and adjust_placement / autoaim_pill / accelerate / find_nearby_support_surface (register or leaf-age ties with recorded reopen criteria). Zero-credit fidelity fix found today for the integrator: in _biped_update_moving, spell `dot_product3d(&biped->unit.desired_facing_vector, &biped->object.forward) > 0.5f`. Ours has the arguments reversed; January pushes [ebx+0x24] first at +0x4f9, and /Od does the same at 0x8c6082..0x8c6093.
|
||||
|
||||
## why_new
|
||||
Measured today. (a) The dot_product3d argument order above, double-attested and not in any bipeds ledger. (b) Frame-slot map: January keeps previous/current_cross at [-0x108]/[-0xf4]; ours puts old_cross at [-0x2c]. The frame +16 was already solved by the um1 donor (0x67c), so it is not the blocker. (c) An M8 oracle on the structural-lane rt1 turning (D=1..8 filler locals) gave section-identical output every time, so the 3 turning leaf swaps are not an IL-local-count tie.
|
||||
|
||||
## prior_negatives_checked
|
||||
claude_lane_b_attempt_logs_20260920/bipeds_REPORT.md: alias labs 1-16, um1 frame, adjust/autoaim/accelerate/support/sight passes, radius paren is GRADED so it fails the Lane A showing, 2 surplus update_physics cells. claude-structural-20260923 units__bipeds/REPORT.md: /Od pass, facing scalars, OOB r_oob, alias labs A-G, rt1, check_discard ruling variant. claude_lane_b_rejected_hypotheses RB2/RB4; bipeds_obj_opus5_150k_w3/100k_waveD ledgers.
|
||||
|
||||
## notes
|
||||
42/51. The object also fails provider links on _cross_product2d (Codex-reserved P1) and _object_get_type. Only check_discard (+176 B) is credible this round, and only if the owner says yes. Lab evidence: scratch/w/triage_objects_physics/{lab_rt1.c,m8probe.py,leas.py,od/bipeds_0x8c5840.txt}.
|
||||
@@ -0,0 +1,19 @@
|
||||
# source/units/vehicles
|
||||
|
||||
## decision
|
||||
OWNER
|
||||
|
||||
## est_probability
|
||||
0.2
|
||||
|
||||
## route
|
||||
The two functions need different things. (1) _update_alien_fighter_physics_new (1,088 B) is exact with the /Od-attested cross_product2d view casts (0x8f6cbf..0x8f6ccd; byte-inert strip; prefix layout) plus removal of the TU-wide REAL_MATH_EXTERNAL_POINT_FROM_LINE3D. vehicles is one of ruling #1's 17 objects. That emits _cross_product2d, which gets LNK2005 against actor_combat's NODUP copy: a dependency on the RESERVED Codex P1 packet. Re-ask the owner under ruling #6 once Codex reports. (2) _update_alien_scout_physics (2,464 B; frame 0x94 vs ours 0xa0) is exact only with two load-bearing aggregate 3D->2D view copies (structural owner packet §5, unanswered) and a leveling point_from_line2d that contradicts /Od 0x8f8b4a and works only through the count oracle. Admissible now at zero credit: `"static": true` for _update_turret_physics (symbols.json l.7052) plus a csplit regen, and review_vehicles/fallback_hunks12.patch (define removal plus /Od-attested pathfinding point_from_line3d calls; 37/2, provider link PASS).
|
||||
|
||||
## why_new
|
||||
New since r1: the §5 view-copy question has still not been answered (grep of docs finds no ruling), and the fighter's remaining blocker has narrowed to the Codex-reserved actor_combat provider. The other inherited link failures (_interpolate_scalar, _object_get_bounding_sphere, _triple_product3d) no longer appear in the hint packet.
|
||||
|
||||
## prior_negatives_checked
|
||||
r1 fn_vehicles_source_units_vehicles.md and REVIEW__source_units_vehicles.md (BLOCKING 1-3; with the /Od component leveling only a 2-instruction M8 leaf swap at +0x628 remains, and any +1 inline temp closes it = oracle, not source); claude_structural_owner_packet_20260923.md §5; Lane B RB4/held fighter; vehicles_obj.md.
|
||||
|
||||
## notes
|
||||
Object completion also needs the invented helper debt removed: vehicle_cross/dot/triple_product3d_target (vehicles.c:1925-1949) and vehicle_dot_product3d_test (l.1382), used by the exact _update_human_boat_physics and _vehicle_preprocess_node_orientations. r1 boat1/boat2 /Od transcriptions leave 17 D-invariant blocks. The fighter alone is roughly 0.6 after P1 plus a ruling.
|
||||
@@ -0,0 +1,86 @@
|
||||
# source/ai/actors
|
||||
|
||||
## verdict
|
||||
OBJECT_COMPLETE_CANDIDATE
|
||||
|
||||
## newly_exact_functions
|
||||
[
|
||||
"_actors_spawn_from_unit",
|
||||
"_actor_input_update"
|
||||
]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/final.c",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/final.obj",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/actors_final.patch",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/parked_retire.patch",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/config_status.patch",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/MANIFEST.md",
|
||||
"C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/LEDGER.md"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
All three patches are mechanical and pass git apply --check together at HEAD b7c1b7d9 (canonical f6d00a8c plus a scratch-only commit):
|
||||
(1) C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/actors_final.patch (sha1 691e8fbc). It edits source/ai/actors.c only and reproduces final.c (sha1 d9dc3764) byte for byte. There is no header change, no symbols.json change and no flag change.
|
||||
(2) scratch/w/actors/parked_retire.patch (sha1 7e937267). It retires both actors parks, _actors_spawn_from_unit and _actor_input_update (config/parked.json lines 667-704, 86 -> 84 entries). The file is edited in place, not re-serialized.
|
||||
(3) scratch/w/actors/config_status.patch (sha1 0e7d18f0). It sets source/ai/actors.c from NonMatching to Matching in config/config.json.
|
||||
There is no shared-header patch, so there is no consumer list: only actors.obj changes.
|
||||
A second agent ran under the same label and wrote r2w1b_actors_c_v2.patch. That patch is the same source minus one byte-inert declaration reorder, and its object is section-identical to final.obj. actors_final.patch supersedes it.
|
||||
|
||||
## evidence
|
||||
Gate: production is 74/76. final.c gives `== exact 76 residual 0 unwritten 0`.
|
||||
- _actors_spawn_from_unit: 672/29 relocs, sha 38d0b2f1 (production 688).
|
||||
- _actor_input_update: 2384/89 relocs, sha bf2e8744 (production f6ff0151). relocdiff shows 0 differing rows and real_regions shows 0 REAL regions.
|
||||
|
||||
Spawn changes (/Od fn 0x44dfe0):
|
||||
- Lane A p1 hunk 1: the ternary source_actor_index, via temp [ebp-0xe8] into [ebp-0x10].
|
||||
- Lane A p1 hunk 2: a real call to point_from_line3d. /Od 0x42e0d0 is result = v*t + p, and it replaces a hand expansion.
|
||||
- Byte-inert changes, each /Od-attested:
|
||||
- real_random_range at 3 sites (/Od 0x42f360 is real_random_range);
|
||||
- short spawned_actor_count (word [ebp-8]);
|
||||
- /Od declaration order in the loop body.
|
||||
|
||||
input_update: the full /Od readout of 0x4486c0 gives named locals in declaration order.
|
||||
- Load-bearing changes; leave-one-out shows each is required:
|
||||
- Swarm loop makes real calls to actor_swarm_component_refresh (0x44bb30) and add_vectors3d (0x44e8e0), with a short counter.
|
||||
- (a) The parent is fetched with object_get, with a typed vehicle view at -0x3c.
|
||||
- (b) Named firing_variant_definition at -0x44.
|
||||
- (d) Named prevehicle_encounter at -0x58.
|
||||
- (e) The production-only stored_prevehicle alias is dropped.
|
||||
- (f) firing_position_type_mismatch flag with an if/else-if pair (0x448da3/0x448dc6).
|
||||
- (g) Threat is fetched with object_get, with a projectile view at -0x70 and two stores (0x448f6f/0x448f9a).
|
||||
- Byte-inert changes, kept for /Od fidelity: `!=` migrate polarity, normalize3d as a separate statement, and a single-exit if/else swarm tail.
|
||||
- An independent agent reached the same sha with a different /Od subset.
|
||||
|
||||
Audit on final.obj:
|
||||
- object_audit PASS: 137 January symbols, 0 differ.
|
||||
- New surplus is only _add_vectors3d and _point_from_line3d, 48 B each, selection ANY. They are byte-identical to January's selected copies (actor_combat and action_charge). Both are cachebeta publics, and neither has a NODUP definer.
|
||||
- provider_link: --baseline PASS for both symbols in both orders. The full run also passes (46 rows).
|
||||
- Candidate pdb storage: 0 disagreements.
|
||||
- Data sections are identical to production, and report data is 2288/2288.
|
||||
- There are no rejections for the unit.
|
||||
- Strip tests: removing every cast gives an identical sha.
|
||||
- /W3 shows 6 pre-existing C4244 warnings (production has 7) and no C4133 or C4013.
|
||||
- fake_match_scan: 0 leads.
|
||||
|
||||
Rule-6 exception (all-inlined class, owner ruling 5): a genuine header __inline, an identical COMDAT, a strict-exact caller and a passing link are all met.
|
||||
|
||||
Full evidence is in C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/LEDGER.md and MANIFEST.md, with /Od readouts in od_*.txt.
|
||||
|
||||
## blockers
|
||||
None at the object level. The integrator still has to:
|
||||
- run the full ninja build, the stable diff and parked_functions validation (84 entries expected);
|
||||
- confirm zero regressions (only actors.obj bytes should move).
|
||||
|
||||
Dependency note: the provider for _add_vectors3d is actor_combat, which is reserved for the external Codex packet. This packet does not edit it, but if that packet changes actor_combat's COMDAT emission, re-run provider_link for actors.
|
||||
|
||||
Optional and not this lane's delta: _actor_handle_unit_effect is strict exact at base, but objdiff 3.3.1 scores it 96.8% (5 jump-table labels). It could get a semantic_matches.json entry.
|
||||
|
||||
## reopen_criteria
|
||||
None needed; the object is complete. Revisit only if the integrator's full sweep shows a regression. If it does, bisect with the leave-one-out probes (lo_*.c). If the actor_combat provider changes, re-run provider_link.
|
||||
|
||||
## manifest
|
||||
C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/MANIFEST.md
|
||||
|
||||
ledger: C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/actors/LEDGER.md
|
||||
@@ -0,0 +1,111 @@
|
||||
# source/cache/xbox_texture_cache
|
||||
|
||||
## verdict
|
||||
OBJECT_COMPLETE_CANDIDATE
|
||||
|
||||
## newly_exact_functions
|
||||
[]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\combined.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\01_tu_local_and_symbols.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\02_texture_cache_header_SHARED.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\03_bitmap_group_header_SHARED.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\04_config_status.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\patches\\symbols.json",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\cand_P3.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\cand_P2_xbox_texture_cache.h",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\cand_FINAL.obj",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\MANIFEST.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\LEDGER.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\xbox_texture_cache\\tools\\hsweep.py"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
All patches are in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\xbox_texture_cache\patches\. They are LF git-style diffs; apply them in order 01 to 04, or use combined.patch.
|
||||
|
||||
(1) 01_tu_local_and_symbols.patch:
|
||||
- xbox_texture_cache.c: the three first-party renames. texture_cache_debug_block_name becomes texture_cache_name_block_proc, texture_cache_debug_bitmap_compare becomes compare, and texture_cache_build_hardware_format becomes texture_cache_initialize_hardware_format (prototype, definition and use of each). The stale _code_ header inventory is refreshed.
|
||||
- #include "bitmaps/bitmaps_internal.h" replaces the TU-local bitmap_get_pixel_data_size prototype.
|
||||
- #include "rasterizer/xbox/rasterizer_xbox.h" replaces `extern D3DDevice global_d3d_device;`, and flush now passes the pointer.
|
||||
- config/symbols.json, 6 in-place row edits: 7239 _texture_cache_name_block_proc, 7242 _compare, 7250 _texture_cache_initialize_hardware_format, and "static": true on 7243-7245 (_IDirect3DDevice8_IsBusy@4, _IDirect3DDevice8_KickPushBuffer@4, _IDirect3DBaseTexture8_IsBusy@4).
|
||||
- The full edited CRLF copy is patches/symbols.json. It is byte-identical to the config that produced the emulated split.
|
||||
- After applying: csplit regen. Only source/cache/xbox_texture_cache.obj changes, as verified by diff -rq on the emulated split.
|
||||
|
||||
(2) 02_texture_cache_header_SHARED.patch (shared header):
|
||||
- source/cache/texture_cache.h gains `void texture_cache_debug_render(void);`.
|
||||
- NEW file source/cache/xbox_texture_cache.h: a focused owner header with the bitmap_format_to_d3d_format and bitmap_format_to_d3d_linear_format prototypes. It follows the math/real_math_planes.h precedent and its comment gives the reason.
|
||||
- xbox_texture_cache.c drops its 3 local public prototypes and includes the new header.
|
||||
- source/render/render_debug.c adds #include "cache/texture_cache.h", which fixes the implicit call at line 564.
|
||||
- texture_cache.h consumers (14): source/bink/bink_playback.c, source/cache/cache_files_windows.c, source/cache/xbox_texture_cache.c, source/effects/decals.c, source/interface/hud.c, source/interface/hud_draw.c, source/interface/hud_messaging.c, source/interface/hud_nav_points.c, source/interface/hud_unit.c, source/interface/hud_weapon.c, source/interface/ui_widget.c, source/objects/object_lights.c, source/objects/widgets/lightning.c, source/rasterizer/xbox/rasterizer_xbox.c. After the patch, source/render/render_debug.c is a 15th.
|
||||
- The new header's only includer is xbox_texture_cache.c.
|
||||
|
||||
(3) 03_bitmap_group_header_SHARED.patch (shared header):
|
||||
- source/bitmaps/bitmap_group.h struct bitmap_data is corrected to HCEX. 0x16 `unsigned short pixel_data` becomes `short mipmap_pad`, 0x18 becomes `long pixels_offset`, 0x1C becomes `long pixels_size`, 0x20 becomes `long tag_index`, and 0x24 `void *bitmap_data_pointer` becomes `long cache_block_index`.
|
||||
- Consumer renames in source/bink/bink_playback.c (615-617; `cache_block_index= NONE` replaces `bitmap_data_pointer= (void *)NONE`) and source/bitmaps/bitmaps.c (1149, 1153).
|
||||
- xbox_texture_cache.c drops the TU-local struct bitmap_data (with its 8 verify typedefs) and the xbox_bitmap_group_prefix reserved-byte view. It includes bitmaps/bitmap_group.h, uses bitmap_group_get() and ->pixel_data.file_offset, and renames fields: ->tag_index x7, ->pixels_offset x1, ->pixels_size x4.
|
||||
- Complete list of the 45 bitmap_group.h consumer TUs (no paths with spaces), in scratch/w/xbox_texture_cache/consumers_bitmap_group_h.txt: source/bink/bink_playback.c, source/bitmaps/{bitmap_drawing,bitmap_extract,bitmap_group,bitmap_utilities,bitmaps,bitmaps_quantitize,targa_file,tiff_file}.c, source/cache/predicted_resources.c, source/cutscene/cinematics.c, source/effects/{contrails,decals,particle_systems,particles,weather_particle_systems}.c, source/game/game_engine.c, source/interface/{hud,hud_draw,hud_messaging,hud_nav_points,hud_weapon,interface,overhead_map,ui_widget,virtual_keyboard}.c, source/main/main.c, source/objects/object_lights.c, source/objects/widgets/{antenna,glow,lightning}.c, source/rasterizer/{rasterizer_cinematics,rasterizer_swizzle,rasterizer_text}.c, source/rasterizer/xbox/{rasterizer_xbox,rasterizer_xbox_detail_objects,rasterizer_xbox_environment_fog,rasterizer_xbox_hardware_bitmaps,rasterizer_xbox_motion_sensor,rasterizer_xbox_screen_effect,rasterizer_xbox_transparent_geometry}.c, source/render/{render_contrails,render_sprite}.c, source/structures/structure_render.c, source/text/draw_string.c. After the patch, source/cache/xbox_texture_cache.c is a 46th.
|
||||
|
||||
(4) 04_config_status.patch: config/config.json line 403, xbox_texture_cache.c NonMatching becomes Matching.
|
||||
|
||||
No parks to retire; the unit has none.
|
||||
|
||||
Verification:
|
||||
- git apply --check exits 0 at HEAD for combined, 01 and 04. HEAD's source equals f6d00a8c.
|
||||
- GNU patch applying 01 to 04 in sequence reproduces combined.patch and the tested shadow tree byte for byte.
|
||||
|
||||
## evidence
|
||||
Baseline production: gate 25/25 EXACT; object_audit FAIL(3) (the XDK wrappers are storage 2 in the split, 3 in ours); pdb_storage shows 3 disagreements (not PDB-public, so static).
|
||||
|
||||
First-party names:
|
||||
- The Sept-2001 cachebeta xbe map (atlas 7eacac85, tier map) lists all 22 xbox_texture_cache.obj code names at a constant delta of 0xE900 from January. It gives _texture_cache_name_block_proc at 0x1bcf60, _compare at 0x1bd0b0 and _texture_cache_initialize_hardware_format at 0x1bd220.
|
||||
- January's own atlas 4cc87b45 lists _compare at 0x5ae7b0, exact tier.
|
||||
|
||||
bitmap_data layout: HCEX `DIA2Dump -type bitmap_data` gives the field list above. January's assert string attests `texture->bitmap->cache_block_index`.
|
||||
|
||||
Sweep tool (hsweep.py): it compiles all 612 build.ninja TUs from a shadow copy with production flags and relative paths. The control run reproduced build/base 612/612 identical.
|
||||
|
||||
Item (c) as specified regresses:
|
||||
- It moved decals::_decals_delete_permanent_from_cluster from EXACT to residual and moved hud_weapon::_render_weapon_hud (declaration-count law).
|
||||
- Lab oracle countscan (never landed): any 1 of the 3 genuine prototypes is inert; debug_render plus either format prototype breaks decals; the two format prototypes together break decals and hud_weapon.
|
||||
- Hence the redesign: debug_render goes into texture_cache.h and the mappers into a focused header. The mappers have no January caller outside this object (undefined-symbol census over build/split).
|
||||
- The P2 sweep: 13/13 other consumers identical.
|
||||
|
||||
Other sweeps:
|
||||
- bitmap_group.h HCEX correction with the 2 consumer renames: 45/45 consumers identical.
|
||||
- P3: 47/47 identical.
|
||||
- render_debug.c including texture_cache.h: identical.
|
||||
- FINAL (all patches together, all 612 TUs): 611 identical; only xbox_texture_cache differs, through its renamed symbols. No park moves: the bitmap_group and bink_playback parks are in byte-identical objects.
|
||||
|
||||
FINAL candidate against the emulated split (csplit of the edited symbols.json; only the texture cache object changes):
|
||||
- 25/25 EXACT, with size, normalized sha, reloc count and storage equal (fn_table_FINAL.txt).
|
||||
- object_audit PASS: 17 January-owned data sections ok and 46/46 symbols.
|
||||
- pdb_storage: 0 disagreements.
|
||||
- surplus_identity: 2 COMDATs IDENTICAL.
|
||||
- provider_link: PASS in both orders on 19 rows.
|
||||
- A symbol census found no other object defining or referencing the 9 changed names.
|
||||
|
||||
Files:
|
||||
- Ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\xbox_texture_cache\LEDGER.md
|
||||
- Manifest: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\xbox_texture_cache\MANIFEST.md
|
||||
|
||||
## blockers
|
||||
None by measurement. For the owner and integrator:
|
||||
- The new file source/cache/xbox_texture_cache.h needs acceptance.
|
||||
- TU-local bitmap type/format/flag enums remain. This is board-wide schema debt shared with bitmaps.c, bitmap_utilities.c, bitmap_extract.c, bitmap_group.c and bink_playback.c; no owner header exists, and the 20260904 ledger calls it a veto class. It needs an owner ruling or a board-wide enum-owner packet.
|
||||
- texture_cache_debug_bitmaps keeps its provisional name. The map atlas is code-only and HCEX has only the PC cache.
|
||||
- The existing `(boolean (*)(long, long))compare` cast at the qsort_4byte call is exact but a style question.
|
||||
- Isolated sweeps do not compose with other lanes' header packets. Re-run the decals sentinel and parks on the live tree after applying.
|
||||
|
||||
## reopen_criteria
|
||||
If the integrator rejects the new focused header, the fallback is to delete the two format-mapper prototypes outright. They are defined before their only in-TU use and have no external caller. Placing them in texture_cache.h is measured to regress decals and must not be used.
|
||||
|
||||
For the TU-local enums: they are cleared by an owner ruling that accepts TU-local tag enums until a board-wide bitmap-enum packet exists, or by that packet itself.
|
||||
|
||||
The packet must be re-validated if another lane lands a texture_cache.h or bitmap_group.h change first.
|
||||
|
||||
## manifest
|
||||
C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\xbox_texture_cache\MANIFEST.md
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\xbox_texture_cache\LEDGER.md
|
||||
@@ -0,0 +1,33 @@
|
||||
# source/hs/hs_runtime
|
||||
|
||||
## verdict
|
||||
FUNCTIONS_EXACT_OBJECT_BLOCKED
|
||||
|
||||
## newly_exact_functions
|
||||
[
|
||||
"_render_debug_trigger_volumes"
|
||||
]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\compose_mine_first\\source\\hs\\hs_runtime.c"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
Same patch as the function unit: production.patch / production_crlf.patch plus park_retire.patch. It composes with the separate storage patch in either order.
|
||||
|
||||
## evidence
|
||||
Unit gate goes from 64/66 to 65/66.
|
||||
|
||||
With this patch alone, object_audit is FAIL(13): begin_random plus the 12 storage rows. Composed with scratch/w/hs_runtime_storage/hs_runtime_converter_storage.patch it is FAIL(1): begin_random only, all 129/129 January symbols match, provider_link PASS.
|
||||
|
||||
## blockers
|
||||
_hs_evaluate_begin_random is a retired register tie.
|
||||
|
||||
## reopen_criteria
|
||||
A same-compiler donor or a January local record for begin_random's preheader movsx register choice.
|
||||
|
||||
## manifest
|
||||
null
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime__render_debug_trigger_volumes\LEDGER.md
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
# source/hs/hs_runtime::_render_debug_trigger_volumes (1088 B)
|
||||
|
||||
## verdict
|
||||
FUNCTIONS_EXACT_OBJECT_BLOCKED
|
||||
|
||||
## newly_exact_functions
|
||||
[
|
||||
"_render_debug_trigger_volumes"
|
||||
]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\cand.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\cand.obj",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\production.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\production_crlf.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\park_retire.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\park_retire_crlf.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\MANIFEST.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\LEDGER.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime__render_debug_trigger_volumes\\compose.obj"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
All paths are under C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime__render_debug_trigger_volumes\ (':' is illegal in NTFS paths, so the slug is sanitized).
|
||||
|
||||
(1) production.patch (LF, matches the index blob) or production_crlf.patch (CRLF working tree): source/hs/hs_runtime.c. It replaces only the render_debug_trigger_volumes body, 2 hunks at lines 1004-1137. Both variants pass `git apply --check` at f6d00a8c. GNU patch simulation reproduces cand.c byte for byte from both the LF HEAD blob and the CRLF working tree, and the patched CRLF file gates EXACT.
|
||||
|
||||
(2) park_retire.patch (or park_retire_crlf.patch): config/parked.json. It removes the entry {unit source/hs/hs_runtime, function _render_debug_trigger_volumes, class unclassified} by deleting lines 1338-1348 in place (no re-serialisation). It passes `git apply --check` and the result is valid JSON.
|
||||
|
||||
No header, symbols.json or config status change. hs_runtime.c stays NonMatching.
|
||||
|
||||
New candidate-only emission: `_point_from_line3d`, an external SELECT_ANY .text COMDAT of 48 B. It is admitted under owner ruling 5 (2026-09-21, the all-inlined header-inline class). All five conditions hold:
|
||||
- genuine real_math.h __inline;
|
||||
- byte-identical to January's selected copy in action_charge.obj (sha 9b763841f8519177);
|
||||
- strict-exact caller;
|
||||
- zero regressions in the unit sweep;
|
||||
- no hand expansion.
|
||||
|
||||
Integrator steps:
|
||||
- run a full ninja and the stable sweep;
|
||||
- after the reserved Codex real_math packet lands, re-run surplus_cand.py and provider_link.py for hs_runtime.
|
||||
|
||||
The parallel storage ADMISSION patch (scratch/w/hs_runtime_storage/hs_runtime_converter_storage.patch) touches different hunks. Applying the two in either order gives byte-identical files.
|
||||
|
||||
## evidence
|
||||
Baseline gate (unmodified file): 64 exact / 2 residual. The residuals are begin_random and trigger_volumes, both [sha].
|
||||
|
||||
Final cand.c gate: 65 exact / 1 residual / 0 unwritten. _render_debug_trigger_volumes is EXACT: 1088 B, 34 relocations, normalized sha 5789a872498d7ef2, equal to January. begin_random's bytes are unchanged.
|
||||
|
||||
It was exact on the first compile of the task route (c1). Further measurements:
|
||||
- Renaming points to corner (the /Od RTC name) is byte-inert.
|
||||
- Seven declaration orders all stay EXACT, including the full /Od frame order and color declared in the else block. Declaration placement is therefore inert.
|
||||
- Computing axis before side is also EXACT (inert).
|
||||
- Strip test: hoisting the three point_from_line3d tail calls out of the two arms (single_tail.c) is NOT exact. alndiff shows 342/342 instructions, 53 hunks and 97 differing frame-slot instructions. The duplicated tail is therefore load-bearing in January's bytes, and the /Od build shows it as source text: double attestation.
|
||||
|
||||
/Od facts (the aligned-frame function at 0x606c80..0x607462, od_trigger_volumes.txt):
|
||||
- fn 0x42e0d0 decodes to point_from_line3d(p, v, t, result).
|
||||
- It is called 8 times: 1.0 / 1.0 / 1.0 / -1.0 in each arm (constants at 0x93dd5c and 0x9401b4) and 0.5 for center (0x93dd50).
|
||||
- The RTC descriptor at 0x607464 names matrix, local_extent, world_extent, corner, sides, color, center, ray, result.
|
||||
- HCEX_Release.pdb lists matrix, local_extent, world_extent, sides[2], result, ray.
|
||||
|
||||
Admission battery on cand.obj:
|
||||
- object_audit: the function is ok. The only new surplus is +.text _point_from_line3d (48 B). FAIL(13) is all pre-existing: begin_random plus 12 converter storage rows.
|
||||
- surplus_cand.py: _point_from_line3d is NEW and IDENTICAL to source/ai/action_charge.obj.
|
||||
- provider_link --baseline: PASS in both orders.
|
||||
- nodup_census: 24 definers, 0 NODUP.
|
||||
- definers.py: existing definers span config index 37 to 470 and hs_runtime is 283, so the selected copy cannot change in either link direction.
|
||||
- cachebeta publics include _point_from_line3d (external, which agrees).
|
||||
- fnsweep.py over 127 January-owned sections: gain 1, regression 0, changed-vs-base 1. My baseline compile equals the build/base production object.
|
||||
- /W3 /WX: no warnings.
|
||||
|
||||
Composed with the storage patch: gate 65/1, object_audit FAIL(1) (begin_random only, all 129 January symbols match), provider_link PASS.
|
||||
|
||||
Full ledger: LEDGER.md. Manifest: MANIFEST.md.
|
||||
|
||||
## blockers
|
||||
The function is closed; the object stays incomplete for two reasons:
|
||||
(a) _hs_evaluate_begin_random (528 B) is a 4-ModRM-byte register tie. It was retired by w1, w3c and the round-2 triage and was not re-probed.
|
||||
(b) The 12 converter storage rows are handled by the separate claim 'source/hs/hs_runtime (storage: 12 converters)'. That patch composes cleanly with mine.
|
||||
|
||||
The COMDAT byte-identity must be re-checked after the reserved Codex math/real_math packet lands. This route does not edit real_math.h.
|
||||
|
||||
## reopen_criteria
|
||||
Object completion needs begin_random, which reopens only on a same-compiler donor or a January local record for the loop-invariant sign-extension register choice. Re-verify the _point_from_line3d COMDAT identity after the Codex real_math packet lands.
|
||||
|
||||
## manifest
|
||||
C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime__render_debug_trigger_volumes\MANIFEST.md
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime__render_debug_trigger_volumes\LEDGER.md
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
# source/hs/hs_runtime (storage: 12 converters)
|
||||
|
||||
## verdict
|
||||
ADMISSION_FIX_PROPOSED
|
||||
|
||||
## newly_exact_functions
|
||||
[]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime_storage\\hs_runtime_converter_storage.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime_storage\\cand.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime_storage\\cand.obj",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime_storage\\MANIFEST.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\hs_runtime_storage\\LEDGER.md"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
One patch: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime_storage\hs_runtime_converter_storage.patch. It is LF, has 12 hunks and changes 24 lines. It adds the `static ` prefix to the 12 prototypes (hs_runtime.c:469-491) and the 12 definitions (:1541-1647) of hs_long_to_boolean, hs_short_to_boolean, hs_string_to_boolean, hs_data_to_void, hs_short_to_real, hs_long_to_real, hs_enum_to_real, hs_real_to_short, hs_real_to_long, hs_long_to_short, hs_object_name_to_object_list and hs_object_to_object_list. `git apply --check` is clean in the worktree. GNU patch on the f6d00a8c blob reproduces the LF-normalised candidate exactly. No symbols.json edit is needed: lines 3203-3214 are already "static": true and the split has storage 3. No shared-header change, no config status flip (the object stays NonMatching at 64/66), and no parks to retire.
|
||||
|
||||
## evidence
|
||||
All gate rows are unchanged: 64 exact, 2 residual, 0 unwritten, identical to baseline. Comparing the base object with the candidate, all 172 sections are identical in bytes, flags and relocations, and all 505 symbols match. The only difference is the 12 converters' storage class, which goes from 2 to 3. The base object is identical to build/base/source/hs/hs_runtime.obj. object_audit: symbol mismatches go from 12 to 0, and the total goes from FAIL(14) to FAIL(2), where the 2 are the untouched .text residuals. The PDB-storage check run on the candidate (pdb_storage_cand.py, same logic): disagreements go from 12 to 0. provider_link: FAIL(12) 'NO JANUARY PROVIDER' becomes PASS; the remaining 25 surplus rows pass in both link orders. surplus_identity: the 4 COMDATs are byte-identical to January's copies. The .data section (_hs_type_inspectors, 9804 B, containing typecasting_procedures) audits ok. January evidence: none of the 12 names is in the cachebeta publics. The only code publics in RVA 0xB9C00-0xBA600 are _hs_runtime_dispose, _hs_can_cast and _hs_cast; the converters sit at 0xBA220-0xBA38F. HCEX.pdb reports all 12 as `static function: true` with undecorated names `static long hs_<name>(long)`, while the control hs_cast has a PublicSymbol and no static flag. A grep over source/ and libs/ finds the 12 names only in hs_runtime.c: prototypes, the matrix and definitions. They are address-taken, so no private ABI is possible. The 20260904 reconciliation ledger's 'Deliberate linkage exception' said static helpers would be dead-stripped until the genuine matrix existed. The matrix is now present and audits ok, so that exception no longer applies. Composition check: the patch applies with offset -8 on the sibling's render_debug_trigger_volumes candidate c2.c. The combined file gates 65/1/0, and its object differs from the sibling's c2.obj only in the 12 storage classes. Files: LEDGER.md, MANIFEST.md, cand.c, cand.obj, gate_base.txt, gate_cand.txt, audit_base.txt, audit_cand.txt, pdb_storage_cand.txt, provider_link_base.txt, provider_link_cand.txt, hcex_all.txt, converter_rows.txt and objcmp_base_vs_cand.txt, all under C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime_storage\.
|
||||
|
||||
## blockers
|
||||
Claim dependency: the whole unit source/hs/hs_runtime is held by sibling 'r2w1-hs_runtime::_render_debug_trigger_volumes (1088 B)'. The literal sub-key claim succeeded, so I worked only in scratch. The integrator must sequence this patch with the sibling's patch. They touch disjoint hunks: the sibling edits lines 1018-1131, and I verified the two compose byte-inertly. Object completion is still blocked by two things. First, _hs_evaluate_begin_random: a tie-shaped residual of 4 ModRM bytes, parked as private-register-convention and retired by triage. Second, _render_debug_trigger_volumes (the sibling's route). The 4 surplus header COMDATs (_scale_vector3d, _set_real_point3d, _set_real_vector3d, _vector_from_points3d) depend on that route under rule 6.
|
||||
|
||||
## reopen_criteria
|
||||
Nothing to reopen for storage: the patch is complete and byte-inert. Whole-object admission becomes possible once the sibling's _render_debug_trigger_volumes route lands strict-exact with admissible COMDATs, and once _hs_evaluate_begin_random gets new first-party evidence (/Od or HCEX locals order) that breaks its 4-byte register tie. At that point, rerun the full section-4 audit on the combined candidate.
|
||||
|
||||
## manifest
|
||||
C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime_storage\MANIFEST.md
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\hs_runtime_storage\LEDGER.md
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_environment
|
||||
|
||||
## verdict
|
||||
FUZZY_IMPROVED
|
||||
|
||||
## newly_exact_functions
|
||||
[]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\patches\\p1_spot_od_shape.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\patches\\p2_object_prereqs.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\cand\\cand_spot_odorder.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\cand\\cand_full.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\lab\\oracle\\forcecur.py",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\lab\\oracle\\forced_7_10894708.obj",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\lab\\m8count.py",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\LEDGER.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_environment\\MANIFEST.md"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
Zero exact credit. (1) Proposed: scratch/w/rasterizer_xbox_environment/patches/p1_spot_od_shape.patch passes git apply --check at f6d00a8c. It replaces the parked 944 B spot body with the /Od-attested shape: `real_matrix4x3 light_matrix`, separate cross_product3d and normalize3d statements, an `inner_radius` local, `cone_scale = 1.0f/(radius - inner_radius)`, and `.l = -cone_scale * inner_radius`. Declarations follow /Od frame order (byte-inert). Measured result: 960 B / 64 relocs, sha a0b9f9f4383b30bc, still residual; the other 42 functions stay exact with an identical name set; the point_from_line3d guard passes. Because the parked function's bytes move, the integrator must update the config/parked.json entry for _rasterizer_environment_specular_spot_light_begin: base -> size 960, relocation_count 64, normalized_sha256 a0b9f9f4383b30bc33f95cd18b48b78abc7d1e23b6b93fc8f3ac56ec33eff121; re-measure objdiff. Suggested evidence text: 'Frame, size and relocations are January-exact with the /Od 0x7e4590 shape (RTC light_matrix, named half-radius local). Forcing one decision in C2's block-local round-robin allocator plus two oracle-only M8 fillers gives full January sha e0331f6b, so the residual is (a) the function's IL-symbol count, needing +2 mod 8, and (b) the normalize3d argument being a pinned operand in January but a local take in ours. Reopen only for a first-party-attested construct that produces both.' Keep class register-allocation. (2) Prepared but NOT for landing now: patches/p2_object_prereqs.patch adds `#define/#undef REAL_MATH_EXTERNAL_NORMALIZE3D` and makes the permutation index static. It keeps 42 exact and removes the surplus _normalize3d that differs from January's copy (a Rule-6 surplus). It must be applied together with in-place "static": true edits to config/symbols.json lines 5722-5727 (the 6 XDK wrappers in env's range), 5755 (spot) and 22727 (_specular_light_vertex_shader_permutation_index). Applied alone it adds an audit storage row. It also needs an emulated-split audit, which should run only once the object can be admitted.
|
||||
|
||||
## evidence
|
||||
The /Od function 0x7e4590 was read: RTC 0x7e4968 gives light_matrix at [ebp-0x40], size 52, and HCEX has the same local. The body is a separate normalize3d statement plus a named radius*0.5f local at [ebp-0x50]. The lab od shape has 248 = 248 instructions. With 2 M8 fillers only 6 real hunks remain, all in the rotation family. Compile order (spot moved to January's slot) is inert. The TU name-count oracle (0..45 single names at 2 positions, 92 compiles) is inert. Scoping, all matrix statement orders, member-wise copies, the XDK public wrappers, extnorm, the DX9 flag (+1 M8), pointer or magnitude locals (+1 each) and an inline normalize wrapper were all measured; none move the rotation. M8 accounting was measured: scalar +1; struct member .i +2 and .j +3; named vertex_constants members count 0, flat/.n[] count 5; type structure and the helper's own locals are inert. C2's local allocator was decoded live with dbg32c (nothing on disk patched): chooser around 0x10756684, owner table 0x1088b1d8, round-robin cursor [0x1088b96c] over {eax,ecx,edx} stored at 0x1075680d, pinned operands written at 0x10756332 without moving the cursor. The TAKE trace for ours is copy1 ecx, fwd edx/edx/ecx, copy2 edx, up.k edx, then the normalize ARG takes eax, and def2/px/py/pz/vc take ecx/edx/eax/ecx/edx. COUNTERFACTUAL: /Od shape + D=2 fillers + one forced cursor store at the 7th take (the argument does not advance the cursor) is STRICT EXACT: 960/64, full normalized sha256 e0331f6b94a74f9c4b4cc2fbed6d8a0cf3d0e3b8d65c487daeac0b7a0e4ab7af equals January's. This was re-verified on the landed declaration order.
|
||||
|
||||
## blockers
|
||||
(a) The spot row needs a genuine construct that adds +2 (mod 8) IL symbols and makes the normalize3d argument a pre-assigned (pinned) operand, or adds two vanishing local takes between the argument and the definition reload. None was found after about 30 evidence-backed shapes, so the stop rule applies. The only +1 candidate, the DX9 success flag, has no Xbox witness. (b) __rasterizer_environment_lightmap_draw: the astra intensity.c candidate is strictly exact but held by owner/reviewer standard, because the per-arm stage-0 filter blocks have no witness and Oct-2001 betaP has the same merged tail. (c) 8 storage rows need symbols.json static:true (6 wrappers, spot, permutation index). (d) The TU-view packet (17 TU-local struct views, 4 consumer-local externs) is untouched. (e) math/real_math is reserved to Codex; no real_math.h change was attempted.
|
||||
|
||||
## reopen_criteria
|
||||
Spot: a first-party-attested source fact that (1) shifts the function's IL-symbol count by +2 mod 8 (lab/m8count.py prints c; od = 0) AND (2) turns the `&light_matrix.left` normalize3d argument into a pinned (globally allocated or fixed) operand, or adds exactly two vanishing local takes before the light->definition reload. Acceptance test: the unforced build reproduces sha e0331f6b...4ab7af. The forced counterfactual in lab/oracle/forcecur.py shows these are the only gaps. Object: owner ruling on lightmap_draw's per-arm filter blocks, plus symbols.json static edits applied with p2 under an emulated-split audit, plus the TU-view declaration packet.
|
||||
|
||||
## manifest
|
||||
C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\rasterizer_xbox_environment\MANIFEST.md
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\rasterizer_xbox_environment\LEDGER.md
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
# source/rasterizer/xbox/rasterizer_xbox_hardware_geometry
|
||||
|
||||
## verdict
|
||||
OBJECT_COMPLETE_CANDIDATE
|
||||
|
||||
## newly_exact_functions
|
||||
[]
|
||||
|
||||
## candidate_files
|
||||
[
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\patches\\01_rasterizer_xbox_hardware_geometry.c.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\patches\\02_symbols.json.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\patches\\03_config.json.patch",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\symbols.json",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\cand.c",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\cand_B.obj",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\MANIFEST.md",
|
||||
"C:\\halo-worktrees\\claude-fifty-objects-r2-20260924\\scratch\\w\\rasterizer_xbox_hardware_geometry\\LEDGER.md"
|
||||
]
|
||||
|
||||
## production_changes
|
||||
Apply all three patches together, in order. Each passes `git apply --check` at f6d00a8c on its own and together. The refreshed copies are in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\rasterizer_xbox_hardware_geometry\patches\:
|
||||
(01) 01_rasterizer_xbox_hardware_geometry.c.patch (blob c2bb9095..dc158d97, identical to the round-1 packet). It deletes the six hand stubs code_00158450/460/470/4b0/4d0/510. It adds `D3DVertexBuffer_MoveResourceMemory(d3d_vertex_buffer, D3DMEM_VIDEO);` after the vertex-buffer Unlock block, with a 3-line disclosure comment. It puts the real names in the header's 'symbols in this file' block.
|
||||
(02) 02_symbols.json.patch (e3580876..6b6e58d3; the index line is refreshed, the body is unchanged). It edits rows 5813-5825 in place: 0x158450 becomes _D3DResource_MoveResourceMemory@8 and 0x158460 becomes _D3DVertexBuffer_MoveResourceMemory@8. 0x158470/4b0/4d0/510 become _D3DVertexBuffer_Unlock@4, _IDirect3DVertexBuffer8_Unlock@4, _D3DIndexBuffer_Unlock@4 and _IDirect3DIndexBuffer8_Unlock@4. "static": true goes on all 13 XDK wrapper rows. The full edited copy (working-tree CRLF) is scratch/w/rasterizer_xbox_hardware_geometry/symbols.json.
|
||||
(03) 03_config.json.patch (b928f182..0938f2d0). It flips index 117 from NonMatching to Matching. The body is normalised from CRLF to LF and a git header is added.
|
||||
Then regenerate csplit. Only rasterizer_xbox_hardware_geometry.obj changes (832 of 833 split objects are byte-identical). No shared header, no consumers, no parks or rejections to retire. The .c and symbols.json patches MUST land together: production source against the new split scores 15/17.
|
||||
|
||||
## evidence
|
||||
NEW FIRST-PARTY NAME EVIDENCE: the Halo symbol atlas has tier-map records (MSVC linker .map ground truth, 2001-09-25).
|
||||
- 6455066470... (retail cache exe), lines 4826-4835, lib rasterizer_xbox_hardware_geometry.obj: 0x504f10 _D3DResource_MoveResourceMemory@8, 0x504f20 _D3DVertexBuffer_MoveResourceMemory@8, 0x504f30 _D3DVertexBuffer_Unlock@4, then IDirect3DVertexBuffer8_Unlock, D3DIndexBuffer_Lock/Unlock, IDirect3DIndexBuffer8_Lock/Unlock and @rasterizer_vertex_buffer_new@20.
|
||||
- 7eacac85... (cachebeta xbe), lines 4295-4300: the same six names at 0x167100/110/120/160/180/1c0. The relative offsets 0/0x10/0x20/0x60/0x80/0xc0 are identical to January 0x158450/460/470/4b0/4d0/510.
|
||||
- 'MoveResourceMemory' appears in no other object in either map, and IDirect3DResource8_MoveResourceMemory appears nowhere. Option A is refuted and B is attested; the four Unlock names are attested too.
|
||||
- Storage: none of the 13 wrappers is a cachebeta.pdb public.
|
||||
|
||||
MEASURED at f6d00a8c against an emulated split (build/tools/csplit.exe on a slug config copy; split_ctl == build/split 833/833; split_B differs in 1 object):
|
||||
- gate --all --forbid-emitted-symbol _point_from_line3d: 17/17 EXACT. .text emission order is identical to January, and both MRM bodies are c2 08 00.
|
||||
- object_audit: PASS, 25 sections ok including all 8 .rdata, 25 symbols with 0 differences. Production is FAIL(7).
|
||||
- pdb_storage: 0 disagreements (production 13). surplus_identity: 0 candidate-only code COMDATs.
|
||||
- provider_link: PASS in both orders on 6 pre-existing rows (3 pooled literals, 3 SDK tables); --baseline=production finds no new surplus.
|
||||
- fake_match_scan: 0 leads.
|
||||
- objdiff 3.3.1 (sha1 3130e428) mini report: candidate vs split_B is 898/898 code, 17/17 functions, 584/584 data; production vs build/split is the same, so the change is credit-neutral. Admission is +1 object.
|
||||
- Patch post-images, applied to the f6d00a8c blobs, are byte-equal to the measured cand.c and cfg_B files.
|
||||
|
||||
Full evidence: scratch/w/rasterizer_xbox_hardware_geometry/LEDGER.md (R0-R5) and MANIFEST.md.
|
||||
|
||||
## blockers
|
||||
None for admission. Remaining disclosure (already in the source comment): the D3DMEM_VIDEO argument and the call's position are byte-inert and not attested. The call's existence is byte-attested because January emits the static wrapper pair, and its spelling is attested by the Sept-2001 maps.
|
||||
Integrator note: the BUG comment in rasterizer_vertex_buffer_new (the XDK CreateVertexBuffer failure path leaves the output unwritten) was already there. It landed in 6130661c under the house-rule-21 ruling (Astra wave6 vertex review). This packet does not introduce it, and it is not a brief section-8 held item.
|
||||
The integrator still has to run: full ninja, the stable sweep, parks/admission, pytest.
|
||||
|
||||
## reopen_criteria
|
||||
Comment-only reopen: a first-party January-dated source or listing that names a different MoveResourceMemory argument or call position. Neither changes bytes. Revert if the integrator's full ninja or stable sweep shows any regression outside this object; none is expected, because only this split object and TU change.
|
||||
|
||||
## manifest
|
||||
C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\rasterizer_xbox_hardware_geometry\MANIFEST.md
|
||||
|
||||
ledger: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\rasterizer_xbox_hardware_geometry\LEDGER.md
|
||||
@@ -0,0 +1,441 @@
|
||||
## source/items/projectiles — HELD_CLASS
|
||||
|
||||
- construct: _projectile_new: a decoration-only outer parenthesis around the definition->projectile.initial_velocity load that feeds the inlined point_from_line3d t argument. It appears either bare or as a TU-private named macro ((definition)->projectile.initial_velocity).
|
||||
- precedent: 2026-09-21 Lane B owner ruling #5 and the RB2 refusal: a decoration-only parenthesis is steering. It is narrowed further by the conditions of the 2026-09-20 named-accessor ruling (73c05198).
|
||||
- completes_object: True
|
||||
- differences: This is RB2's shape exactly: one parenthesis on a plain field load, idempotent, and every undecorated spelling (P1-P14) is residual. It fails the 73c05198 condition that 'the name must carry meaning that first-party sources attest': HCEX lists only the parameter, and no /Od string or atlas name exists. The ai_debug_attractor_label_height macro (ai_debug.c:48-63, edd8b386, 2026-09-20 17:27) does not cover this. It landed under the earlier inferred-macro 'standing rule', 46 minutes before the 18:13 accessor ruling added the first-party-name condition and a day before RB2, and nobody has re-adjudicated it. It is an inconsistency to raise with the owner together with the collisions.c bare parenthesis (now collisions.c:1581, which RB2 explicitly placed under review). On a yes, the object completes together with the data entry below (triage: link_fail and surplus_different are empty).
|
||||
- packet: Held; do not apply. research/fifty_objects_20260925/w/projectiles/lab_pfull.c or lab_localrhsparen.c
|
||||
- evidence: docs/object_matching_logs/claude_lane_b_rejected_hypotheses_20260920.md:45-56 (owner: "A decoration-only parenthesis with no semantic or naming evidence is codegen steering, not admissible source. Revisit the collisions.c precedent separately."). docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:81-82. docs/object_matching_logs/claude_lane_a_adjudication_paren_accessor_20260920.md:126-135 ('What the ruling does NOT license'). docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:321. git show edd8b386 ("landed under the owner's standing rule").
|
||||
|
||||
## source/items/projectiles — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: A single-section semantic_data_matches entry for _projectile_update_section with allow_incomplete_unit (1,548 B, 6 relocations, sha 7bfaf5fb...). The cause is the objdiff 3.3.1 '$'-literal defect.
|
||||
- precedent: The leaf_map _leaf_map_initialize_section allow_incomplete_unit single-section entry (config/semantic_data_matches.json around lines 174-184, ae12a3c1), plus brief section 4.5 (single-section entries are applied by the integrator).
|
||||
- completes_object: False
|
||||
- differences: None material. As in the precedent: one data section, byte- and relocation-identical under coff_compare, undercredited only by the '$'-literal defect, unit still incomplete, and .rdata already at 100%. The snapshot must be re-measured at HEAD before the entry is appended.
|
||||
- packet: C:/halo-worktrees/claude-fifty-objects-20260925/scratch/w/projectiles/semantic_data_entry.json (append to config/semantic_data_matches.json; not yet in canonical)
|
||||
- evidence: config/semantic_data_matches.json leaf_map entry: "allow_incomplete_unit": true, 2512 B / 28 relocations. research/fifty_objects_20260925/results/wave1/fn_projectiles_source_items_projectiles_data_projectile_update_section_.md: 'same as the leaf_map precedent'.
|
||||
|
||||
## source/items/projectiles — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit rule-6 cleanup: replace the hand-expanded point_from_line3d with the /Od-attested call point_from_line3d(&velocity,&forward,initial_velocity,&velocity).
|
||||
- precedent: 2026-09-21 owner ruling #1: _point_from_line3d may be emitted iff January's same object references it out of line. projectiles is one of the 17 objects.
|
||||
- completes_object: False
|
||||
- differences: None. The object is byte-identical to build/base, and _projectile_new keeps its park sha 9d8477d2. git apply --check passes at HEAD 434f0151.
|
||||
- packet: research/fifty_objects_20260925/w/projectiles/production.patch
|
||||
- evidence: docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:65-68 and :156-162 (the list of 17 objects includes projectiles). The house rules (docs/campaign_house_rules.md:29-37, 3c74fa36) forbid hand expansion.
|
||||
|
||||
## source/ai/actions — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _actor_action_handle_vehicle_entry: a new TU-private squaring macro, #define actor_action_distance_squared(distance) ((distance) * (distance)), at the vehicle_entry square.
|
||||
- precedent: 2026-09-20 owner ruling for _actor_perception_refresh: a TU-private, descriptively named inferred macro (5186c5bd, source/ai/actor_perception.c:386-432).
|
||||
- completes_object: False
|
||||
- differences: The 5186c5bd ruling was function-scoped: "Land _actor_perception_refresh (+2,416) with a TU-private ... inferred macro". Its strongest argument, that only ((d)*(d)) matches, does not hold here: the hand-written (d)*(d) also matches, so the bytes do not prove a macro stood at this site. The owner allowed that weak form only inside actor_perception.c, where the macro already existed ('the admitted spelling of this square'). Landing here would create a new macro in another TU. The structural lane held it for exactly this reason (owner packet s7 row). RB2 (2026-09-21) came later and makes a paren-only difference suspect. Rulings are not to be extended across functions (AB handoff item 3). The object completes only if this item AND the grouped-data item are both a yes.
|
||||
- packet: research/fifty_objects_20260925/w/actions/owner_gated_exact.patch (git apply --check OK; replaces production_fuzzy.patch)
|
||||
- evidence: docs/object_matching_logs/claude_lane_a_waveB_frame_and_nearexact_20260920.md:127-129 (the ruling quote). source/ai/actor_perception.c:413-429 (the second-site weak-form note). docs/object_matching_logs/claude_structural_owner_packet_20260923.md:162 ("extends the 2026-09-20 actor_perception ruling to actions.c"). docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:65-69.
|
||||
|
||||
## source/ai/actions — NEW_RULING_NEEDED
|
||||
|
||||
- construct: Grouped 46-member data entry (2,404 B across .data/.rdata), which needs verifier_combined_extent.diff applied to tools/semantic_progress.py.
|
||||
- precedent: Existing grouped semantic data entries (editor_flying_camera 'camera-static-sections', 5019c186, credit_raw_size; the shell_xbox grouped entry).
|
||||
- completes_object: False
|
||||
- differences: The existing groups pass the current verifier. This one fails it ('semantic data group does not cover the reported unmatched sections'), because objdiff's running-offset alignment gives 2388 against a member padded sum of 2396, and raw sizes do not reach 2404. Crediting it needs a scorer/tool change or objdiff 3.6.0. Brief section 4.5 allows only single-section entries, so the integrator or owner must accept the tool change.
|
||||
- packet: research/fifty_objects_20260925/w/actions/verifier_combined_extent.diff + C:/halo-worktrees/claude-fifty-objects-20260925/scratch/w/actions/semantic_data_entry.json
|
||||
- evidence: research/fifty_objects_20260925/results/wave2/fn2_actions_source_ai_actions_data_data_16_rdata_2388_2_404_B_.md:18-27. config/semantic_data_matches.json (group 'camera-static-sections'). docs/object_matching_logs/claude_fifty_objects_20260925.md:317.
|
||||
|
||||
## source/ai/actions — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit fuzzy re-baseline production_fuzzy.patch: vehicle_entry is down to one 5-byte FP/int transposition, with the park re-baselined to 7ef7a0e0. Use it only if the squaring macro is refused.
|
||||
- precedent: House rule 11 and the 2026-09-07 user clarification: preserve the best credible house-rule-compliant fuzzy source at zero credit.
|
||||
- completes_object: False
|
||||
- differences: None. It adds no credit and changes no other section. It is mutually exclusive with owner_gated_exact.patch. git apply --check passes.
|
||||
- packet: research/fifty_objects_20260925/w/actions/production_fuzzy.patch
|
||||
- evidence: docs/campaign_house_rules.md:17 (rule 11) and :49-54 (user clarification 2026-09-07).
|
||||
|
||||
## source/ai/actor_perception — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _actor_perception_aiming_vector_test_blockage (Packet B). It needs three constructs: (1) the /Od-attested aggregate view copy source_planar_direction = *(real_vector2d const *)source_vector; (2) an empty then-arm at hes<0.36; (3) a redundant explicit else blockage = 0;. All three are load-bearing.
|
||||
- precedent: 3ba2eb91 (2026-09-21): the owner-admitted action_obey aggregate view copy (source/ai/action_obey.c:1259) covers construct (1). No precedent covers (2) or (3).
|
||||
- completes_object: True
|
||||
- differences: (1) Covered: /Od 0x4710a0 shows an 8-byte integer aggregate copy, the layout is a compatible prefix, the function is strict exact at 44/44, and the field copy is residual (384!=400). action_obey had the same not-strip-testable caveat and the owner admitted it. (2) The empty then-arm has no credited precedent: a tree scan finds one empty then-arm, first_person_weapons.c:1707, in a parked zero-credit function. (3) A redundant equal-value store was rejected by the owner as 'semantically inert steering' (f5698ba2, _actor_look_update (c); AB table #9). The only difference here is /Od attestation. Structural owner packet s5 put this function to the owner explicitly and has not been answered. The ruling request must also name the four newly emitted COMDATs (_normalize2d, _scale_vector2d, _dot_product2d, _negate_vector3d), per ruling #6.
|
||||
- packet: Blockage body from C:/halo-worktrees/claude-fifty-objects-20260925/scratch/w/actor_perception/final_full.c. research/fifty_objects_20260925/w/actor_perception/production.patch no longer applies at HEAD (Packets A/C landed), so regenerate a blockage-only hunk. Retire the blockage park.
|
||||
- evidence: git show 3ba2eb91: owner quote "Admit only with per-site /Od attestation, byte-inert cast, compatible prefix layout, strict exactness, and ledger disclosure. Land the three; keep the fighter held." plus the action_obey caveat ('cannot be strip-tested ... every undecorated alternative ... residual'). docs/object_matching_logs/claude_structural_owner_packet_20260923.md:127-144. research/fifty_objects_20260925/results/wave1/REVIEW__source_ai_actor_perception.md issue (b). git show f5698ba2.
|
||||
|
||||
## source/ai/action_charge — HELD_CLASS
|
||||
|
||||
- construct: _action_charge_perform. (a) Load-bearing aggregate view copies C1/C2. (b) An /Od-only dead target_point copy and RMW (target_point.z += 0.4f, never read). (c) A named-result subset chosen to fit the count.
|
||||
- precedent: Brief section 2 and section 8: filler/dummy declarations and name-count compensation are an ORACLE, never a landing. The admitted dead-pair precedent (editor_flying_camera 'left' pair) requires that a count-only control is NOT exact.
|
||||
- completes_object: True
|
||||
- differences: (a) alone would be the 3ba2eb91 aggregate-copy class (/Od integer copies at 0x4310c8/0x4311c7). (b) fails the editor_flying_camera condition. An unattested dead RMW in the suicide arm (x_suicide), the same code at the top of the block (x_top), and 3-7 dummy 'long m8_N = 0' locals are all EXACT, so the bytes cannot tell the /Od code from a filler. HCEX has no target_point. (c) Several subsets are exact and the full /Od set is residual. If the owner overrode the hold, a yes would complete the object (22/22, audit PASS).
|
||||
- packet: Held; do not apply. research/fifty_objects_20260925/w/action_charge/production.patch; minimal variant C:/halo-worktrees/claude-fifty-objects-20260925/scratch/w/review_action_charge/v/no_a4_vec.c
|
||||
- evidence: research/fifty_objects_20260925/w/review_action_charge/REVIEW.md B1-B3. docs/object_matching_logs/claude_fifty_objects_20260925.md:169 (editor_flying_camera: 'a count-only control (R4) is not exact'). WORKER_BRIEF_R2.md section 2 lines 47-48 and section 8 lines 196-198.
|
||||
|
||||
## source/structures/structures — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _sphere_intersects_cluster_portal: an inferred `double t = -plane_distance;` temp feeding the inlined point_from_line3d.
|
||||
- precedent: Closest: a4ba37a9 (2026-08-27), the units throw_grenade_release reused `double origin_scale` temp (source/units/units.c:11087-11108). Also the 2026-09-20 inferred-construct disclosure rule (5186c5bd).
|
||||
- completes_object: True
|
||||
- differences: a4ba37a9 predates the 2026-08-30 house rules, the strip test and the /Od-readout practice, and it was never checked against /Od. Here the later /Od build contradicts the temp: 0x8a07bb negates inline and the frame has no t slot. The same-TU exact sibling _render_debug_fog_planes also passes -x directly. Both strip forms (real t, and the plain call) are residual. The temp also adds a /W3 C4244, and common_constants.md allows double only for API or vararg needs. actor_moving.c:2136's `double t` landed only in a zero-credit fuzzy body (ea507d5b), so it is not an admission. If admitted, an in-source inferred-and-contradicted disclosure comment is required.
|
||||
- packet: research/fifty_objects_20260925/w/structures/production.patch (git apply --check OK at HEAD) + the disclosure comment
|
||||
- evidence: git show a4ba37a9 ('a single reused double temp is exact'). research/fifty_objects_20260925/results/wave1/REVIEW__source_structures_structures.md issues 1-4. git show ea507d5b ('ZERO bytes banked').
|
||||
|
||||
## source/rasterizer/rasterizer_geometry — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _uncompress_int32_to_real_vector3d: a staged int-to-real conversion temp (`real value; value = (real)(long)(compressed<<21); ...`).
|
||||
- precedent: Closest: the a4ba37a9 units FP-intermediate reused temp. The 2026-09-20 strip-test rule says to escalate, not rule unilaterally.
|
||||
- completes_object: True
|
||||
- differences: The strip test fires: plain and /Od spellings are residual, and every staged form is exact. First-party /Od 0x82ea80 contradicts the temp: its frame (0x18 = guards + v + cookie) has no scalar slot, and it does one store per component. a4ba37a9 faced no contrary /Od evidence and predates that rule. If admitted, it needs a disclosure comment and the park must be retired.
|
||||
- packet: research/fifty_objects_20260925/w/rasterizer_geometry/production.patch (git apply --check OK) or the t7 variant + disclosure comment; retire the instruction-scheduling park
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_rasterizer_rasterizer_geometry.md issues 1-4 ('The one precedent for a scheduling temp is the units FP-intermediate reused temp. It predates the /Od-readout rule and did not face contrary /Od evidence.').
|
||||
|
||||
## source/bink/bink_playback — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _bink_query_analog_controller_buttons: the q3 else-if split, where START and BACK each assign button_pressed = TRUE in separate arms instead of one ||.
|
||||
- precedent: laws_w3 A26 as applied in 26601453 (2026-09-16), which admits a duplicated-assignment else-if only when January shows distinct rejection blocks. Lane C owner ruling R9 (2026-09-21, _eat_my_shorts) admits a duplicated branch when January and /Od independently attest it.
|
||||
- completes_object: True
|
||||
- differences: 26601453 names this very function as 'the rejected _bink_query_analog_controller_buttons, whose edges share one block': January merges all three je into one mov bl,1 block. R9's /Od condition cannot be met because /Od and HCEA have only bink stubs. The only new evidence is cross-build (Oct 2276betaP/2276P match q3 in 4/4 contexts), a type of evidence no ruling has accepted. Completion also needs the storage packet, which is covered (static bink_pointer_blocks/bitmap/texture/block_count per cachebeta publics) but must be regenerated. Note that _code_001b5850 still breaks house rule 7 (docs/campaign_house_rules.md:13-14 permits a descriptive private-function name); the owner should confirm the name.
|
||||
- packet: research/fifty_objects_20260925/w/bink_playback/production.patch (git apply --check OK) + storage.patch (FAILS at config/symbols.json:23296; re-cut lines 23299/23300/23301/23304 in place) + csplit regen
|
||||
- evidence: git show 26601453 (A26 criterion and the explicit rejection of this site). C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/lane_c/owner_rulings.md:131-138 (R9 'January and /Od independently attest'). docs/object_matching_logs/bink_playback_obj_opus5_next150_n3a_20260915.md:140-146.
|
||||
|
||||
## source/units/vehicles — HELD_CLASS
|
||||
|
||||
- construct: _update_alien_scout_physics: two load-bearing aggregate 3D->2D view copies plus a leveling point_from_line2d.
|
||||
- precedent: Brief section 8: declared-name-count compensation is an oracle only. Review BLOCKING 2 found the leveling point_from_line2d is chosen only because it shifts the count.
|
||||
- completes_object: False
|
||||
- differences: The leveling point_from_line2d contradicts /Od 0x8f8b4a..0x8f8bba (two component statements; 0x444020 is called only twice, both for alpha_desire), and the claimed January-byte evidence was refuted. That makes it the count oracle used as a landing. The two view copies alone would be the 3ba2eb91 aggregate-copy class, but that does not cure the leveling. The object also needs the held fighter (below) and removal of the invented vehicle_*_product3d_target helpers (vehicles.c:1925-1949, 1382).
|
||||
- packet: None to apply (held option B in research/fifty_objects_20260925/w/vehicles/production.patch)
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_units_vehicles.md:39-51. WORKER_BRIEF_R2.md:196-198. docs/object_matching_logs/claude_structural_owner_packet_20260923.md:136-140.
|
||||
|
||||
## source/units/vehicles — HELD_CLASS
|
||||
|
||||
- construct: _update_alien_fighter_physics_new: /Od-attested cross_product2d view casts plus removal of REAL_MATH_EXTERNAL_POINT_FROM_LINE3D. This emits a _cross_product2d COMDAT.
|
||||
- precedent: Explicit owner hold (2026-09-21, 3ba2eb91): "Land the three; keep the fighter held."
|
||||
- completes_object: False
|
||||
- differences: Rulings #1-#3 are otherwise met: the casts are byte-inert and /Od 0x8f6cbf-0x8f6ccd attests them. However, the owner's explicit hold stands, and the new _cross_product2d fails LNK2005 against actor_combat's NODUP copy. That fix is the RESERVED Codex P1 packet. Re-ask under ruling #6 only after Codex reports.
|
||||
- packet: None to apply (scratch/lane_b/orch_land/vehicles_fighter.c in the Lane B worktree; research/fifty_objects_20260925/w/vehicles/production.patch option A)
|
||||
- evidence: git show 3ba2eb91 (owner quote). docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:92. WORKER_BRIEF_R2.md:163-166 (Codex reservation).
|
||||
|
||||
## source/units/vehicles — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit fallback: remove the TU-wide REAL_MATH_EXTERNAL_POINT_FROM_LINE3D define, add the /Od-attested pathfinding point_from_line3d calls (37/2, provider link PASS), and set "static": true on _update_turret_physics.
|
||||
- precedent: 2026-09-21 owner ruling #1: vehicles is one of the 17 objects that reference _point_from_line3d out of line. Storage follows cachebeta publics, as in canonical 05255584.
|
||||
- completes_object: False
|
||||
- differences: None. git apply --check passes for both patches. csplit-only regen, then a full ninja.
|
||||
- packet: research/fifty_objects_20260925/w/review_vehicles/fallback_hunks12.patch + research/fifty_objects_20260925/w/vehicles/symbols_turret_static.patch
|
||||
- evidence: docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:65-68 and :156-162 (the 17 objects include vehicles). git show 05255584 (wrapper and converter rows made static per cachebeta publics).
|
||||
|
||||
## source/interface/interface — NEW_RULING_NEEDED
|
||||
|
||||
- construct: Header variant for the now-static interface_get_weapon_hud_index. Variant A removes the interface.h prototype. Variant B keeps the extern prototype over a static definition.
|
||||
- precedent: Variant A: ruling #4 (genuine owner header, full sweep, ZERO regressions) and the 2026-09-24 canonical rejection of a genuine real_math.h body that lost _rasterizer_frame_statistics_draw. Variant B: no precedent.
|
||||
- completes_object: True
|
||||
- differences: Variant A regresses _rasterizer_frame_statistics_draw (4,176 B) through a pure declaration-count tie (+3 dummy externs restore it), which falls in the held declaration-count-loss class. Variant B is an extern-then-static redeclaration (C4211 at /W4; C89 6.1.2.2 undefined). A tree scan of every static function definition in source/*.c against the header prototypes finds ZERO Halo sites, and C4211 appears nowhere in docs. The owner must pick; no genuine count-balancing packet exists (-3 + 2a + 5b = 0 has no solution).
|
||||
- packet: research/fifty_objects_20260925/w/interface/production.patch + symbols_static.patch (both git apply --check OK) [+ production_variantA_header.patch for A]; retire the parked _interface_get_weapon_hud_index entry in the same change
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_interface_interface.md checks 8-10 and issues. docs/object_matching_logs/claude_object_closure_canonical_reconciliation_20260924.md:43-50 ('the global header edit was rejected'). docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:79-80.
|
||||
|
||||
## source/interface/ui_widget — HELD_CLASS
|
||||
|
||||
- construct: _widget_instance_process_one_event_recursive: split out a new .bss static, dpad_event_times[MAXIMUM_NUMBER_OF_LOCAL_PLAYERS][NUMBER_OF_DPAD_DIRECTIONS], at storage+0x870 (symbols.json static row at file_offset 4541104), together with the structural-lane P3 body.
|
||||
- precedent: Brief section 8 (the owner-queue item-2 class: descriptive .bss split names stay owner-gated). The 2026-09-15 owner ruling (no descriptive or invented static names in symbols.json). The 2026-09-20 data-lane rule that symbols.json names need authenticated provenance.
|
||||
- completes_object: False
|
||||
- differences: None. The name has no first-party source (HCEX _widget_globals has none, /Od has no dpad code, cachebeta has no public, the atlas has no data names). The P3 body is ruling-free zero-credit fuzzy, but it does not close the row without the split. Five tie residuals remain in any case.
|
||||
- packet: Held: C:/halo-worktrees/claude-structural-20260923/scratch/lane/w/interface__ui_widget/v_split_final.c + splitcfg/
|
||||
- evidence: docs/object_matching_logs/opus5_250k_house_clean_checkpoint_20260915.md:20-31. docs/object_matching_logs/claude_lane_a_data_section_credit_20260920.md:89-91, 111-116 ('Nothing can attest these names, so they stay'). WORKER_BRIEF_R2.md:191-195.
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox_lights — HELD_CLASS
|
||||
|
||||
- construct: (1) cand_g2_diagnostic_R15: the vector_from_points3d return pointer plus a hand-written 3-statement dot_product3d brightness accumulation. (2) cand_g4 with rule 6's strict-exact-caller condition waived. Either option also needs the consumer-local global_window_parameters view replaced.
|
||||
- precedent: The R15 rejection (hand-expanded dot accumulation), backed by the refusal of manual expansion where a real call exists (AB table #4, RB3). Option (2) is the brief section 8 P1 class (a new header COMDAT from a non-exact caller).
|
||||
- completes_object: False
|
||||
- differences: None. (1) hand-expands dot_product3d, which is exactly the R15/AB#4 construct. (2) asks to waive the strict-exact-caller condition, which is the P1 class. Both also keep a consumer-local global_window_parameters view with opaque pads, the same defect that keeps canonical dynavobgeom unadmitted. The genuine rasterizer.h:250 type has not been measured on g2/g4.
|
||||
- packet: None to apply (research/fifty_objects_20260925/w/rasterizer_xbox_lights/cand_g2_diagnostic_R15.vs_tree.diff, g4_owner_gated.patch held)
|
||||
- evidence: research/fifty_objects_20260925/w/rasterizer_xbox_lights/LEDGER.md:13-15 (R14/R15/R16). docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:320. docs/object_matching_logs/claude_lane_b_rejected_hypotheses_20260920.md:57-62. docs/object_matching_logs/claude_fifty_objects_canonical_reconciliation.md:36-41 (dynavobgeom hold).
|
||||
|
||||
## source/effects/weather_particle_systems — NEW_RULING_NEEDED
|
||||
|
||||
- construct: _weather_particle_system_render: an /Od-attested dead scalar with an invented name, `short unused_count = 0;` (/Od init-only slot [ebp-0x24] at 0x57fbb4; Lane D class I).
|
||||
- precedent: Lane C owner ruling R8 (2026-09-21) admitted /Od dead arrays because the /Od RTC descriptors NAME them ('rule 8 is not weakened generally'). The editor_flying_camera dead-pair admission required the same RTC name, zero anchor drift and a non-exact count-only control.
|
||||
- completes_object: False
|
||||
- differences: This is a scalar with no RTC descriptor, so the name 'unused_count' is invented, and no count-only control was measured. Lane D class I has had no ruling since 2026-09-22. Completion also needs the _real_local_random provider repair: a real_math.h body change inside the RESERVED Codex real_math unit, which needs a full-board re-sweep because tree D once broke units.
|
||||
- packet: research/fifty_objects_20260925/w/weather_particle_systems/production.patch (git apply --check OK; held)
|
||||
- evidence: C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/lane_c/owner_rulings.md:84-100. docs/object_matching_logs/claude_lane_d_refresh_HANDOFF_20260922.md:142. research/fifty_objects_20260925/results/wave1/REVIEW__source_effects_weather_particle_systems.md issues.
|
||||
|
||||
## source/effects/weather_particle_systems — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit storage fix: drop `static` from one_over_char_max (cachebeta public 0x25AAFC).
|
||||
- precedent: Storage follows cachebeta publics (the standing rule behind every storage packet, e.g. 05255584).
|
||||
- completes_object: False
|
||||
- differences: None. The review measured render unchanged at 19/20 and 30/30 symbols.
|
||||
- packet: No packet file: a one-token edit in source/effects/weather_particle_systems.c (included in research/fifty_objects_20260925/w/weather_particle_systems/production.patch)
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_effects_weather_particle_systems.md check (10). scratch/tools/pdb_storage.py.
|
||||
|
||||
## source/physics/breakable_surfaces — HELD_CLASS
|
||||
|
||||
- construct: B2: the TU-local regrouped helper _breakable_surface_plane_distance, a 32 B static surplus that January lacks (breakable_surfaces.c:42).
|
||||
- precedent: Brief rule 6: 'never hand-expand or hand-copy ... any header helper'. RB3: the owner refuses manual expansion of a helper whose real call exists.
|
||||
- completes_object: False
|
||||
- differences: The cited bsp3d precedent (bsp3d.c:82-94 TU-local plane-distance helpers, 772e3d24 of 2026-08-20) predates the 2026-08-30 house rules, and the owner never answered the static-surplus policy question. /Od 0x7a0ca0 calls the genuine plane3d_distance_to_point at 4 sites, so the local copy contradicts first-party evidence. B1 is held separately.
|
||||
- packet: None to apply (research/fifty_objects_20260925/w/breakable_surfaces_audit2/patches_owner_gated held)
|
||||
- evidence: WORKER_BRIEF_R2.md:40-43. docs/object_matching_logs/claude_lane_b_rejected_hypotheses_20260920.md:57-62. research/fifty_objects_20260925/results/wave1/audit_physics_rast_physics_breakable_surfaces.md:59,82. git log -S bsp3d_plane_distance_to_point (772e3d24).
|
||||
|
||||
## source/physics/breakable_surfaces — HELD_CLASS
|
||||
|
||||
- construct: B1: the /Od-attested named-local body of real_local_random in real_math.h. It adds one declared name to every includer, which loses _rasterizer_frame_statistics_draw and _bitmap_copy.
|
||||
- precedent: Declaration-count-loss class: ruling #4 requires zero regressions, and canonical rejected the identical frame_statistics loss on 2026-09-24. real_math is RESERVED for Codex.
|
||||
- completes_object: False
|
||||
- differences: None: the same victim as the rejected distance3d header body.
|
||||
- packet: None
|
||||
- evidence: docs/object_matching_logs/claude_object_closure_canonical_reconciliation_20260924.md:43-50. docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:79-80. WORKER_BRIEF_R2.md:163-166.
|
||||
|
||||
## source/physics/breakable_surfaces — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-regression sub-packet: call the genuine bsp3d_get_plane_from_designator instead of the hand copy; drop the per-TU '/Ow','/QIfist' override (config.json:520); set "static": true on _breakable_surface_effect and _globals.
|
||||
- precedent: Rule 9 and rule 13 (genuine owner helpers, no hand copies). Rule 22 (/QIfist only where the evidence requires it). Storage follows cachebeta publics.
|
||||
- completes_object: False
|
||||
- differences: None: 12/12 stays exact, and the six helper COMDATs become identical to January's selected copies. symbols.json.patch fails git apply --check at config/symbols.json:23111 and must be re-cut in place. The .c and config patches apply.
|
||||
- packet: research/fifty_objects_20260925/w/breakable_surfaces_audit2/patches/{breakable_surfaces.c.patch, config.json.patch, symbols.json.patch (regenerate)} + csplit regen
|
||||
- evidence: docs/campaign_house_rules.md:12-13, 18, 35-41 (rules 6, 9, 13 and the rule-6 exception text), rule 22 at :39-44. research/fifty_objects_20260925/results/wave1/audit_physics_rast_physics_breakable_surfaces.md.
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox — HELD_CLASS
|
||||
|
||||
- construct: Owner-queue item 2: a .bss split into 23 `= 0` file statics with 9 non-first-party names. The new HCEX target enum evidence (_rasterizer_target_z) would let names #8/#9 become global_d3d_{texture,surface}_z.
|
||||
- precedent: Brief section 8 (the rasterizer_xbox descriptive-name split stays owner-gated unless first-party evidence removes the ruling). 2026-09-15 owner ruling. 2026-09-20 authenticated-provenance rule.
|
||||
- completes_object: True
|
||||
- differences: The HCEX enum attests only enum member names, not variable names. It improves #8/#9 from invented to convention stems, but node_matrix_constants stays invented and #2-#7 stay convention stems. The `= 0` initialisers alone are covered by a595bbc2. rasterizer_xbox_shadows' disclosed descriptive gap statics were a lane judgement call, not an owner ruling. A yes completes the object (95/95, audit PASS, provider_link 15/15).
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/names_xbox_hs_scen/patches/1_rasterizer_xbox/01-05 (held)
|
||||
- evidence: docs/object_matching_logs/claude_fifty_objects_20260925_owner_queue.md:98-147 (evidence against: 2026-09-15 ruling, 2026-09-24 path_obstacle_avoidance hold). WORKER_BRIEF_R2.md:191-195.
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox_debug — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Independent storage patch: 8 XDK wrapper rows (D3DDevice_SetRenderState, IDirect3DDevice8_* wrappers) set to "static": true.
|
||||
- precedent: The canonical R2 batch 1b (05255584) made the XDK wrapper rows static per cachebeta publics for hardware_geometry. It is the same class.
|
||||
- completes_object: True
|
||||
- differences: None. The unit is already labelled Matching (config index 126). This patch removes its object_audit FAIL(8), so the label becomes truthful. csplit radius is rasterizer_xbox_debug.obj only; the gate stays 18/18. git apply --check passes.
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/names_xbox_hs_scen/patches/independent/rasterizer_xbox_debug_static_wrappers_symbols.json.patch + csplit regen
|
||||
- evidence: git show 05255584 ('13 wrapper rows go static'). research/fifty_objects_20260925/w/owner_queue/names_xbox_hs_scen/patches/APPLY_ORDER.txt:30-32.
|
||||
|
||||
## source/render/render_debug — HELD_CLASS
|
||||
|
||||
- construct: Owner-queue item 5 (d): the invented render_debug_globals_definition aggregate. D0 keeps it with its opaque_after_* pad members. D1 uses seven descriptive `= 0` file statics.
|
||||
- precedent: Brief section 8 (render_debug D1 descriptive names stay owner-gated). Brief section 9: pad members in a TU-private struct signal an invented aggregate, which blocks admission (D0). The 2026-09-15 and 2026-09-20 name-provenance rules.
|
||||
- completes_object: True
|
||||
- differences: None. No first-party names exist (cachebeta, HCEX, the 2001 maps and the atlas all lack them). The /Od build and January's layout both contradict the D0 aggregate. The `= 0` layout proof matches a595bbc2, but that precedent had authentic names. Either answer, with 05/06/08, completes the object.
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/patches/08_IF_D_RULED_render_debug_status_matching.patch (+ lab/D1_OPTION_render_debug_separate_statics.patch and lab/D1_OPTION_symbols_json.patch for D1)
|
||||
- evidence: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/RULING.md Q2d. WORKER_BRIEF_R2.md:191-195, 216-219.
|
||||
|
||||
## source/render/render_debug — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit 05 and 06. 05: genuine point_from_line3d calls (/Od 0x84a920/0x84a510/0x848640), the genuine vehicle_datum plus accessor macro, and removal of the dead REAL_MATH_EXTERNAL defines. 06: tentative `boolean debug_*` definitions.
|
||||
- precedent: 05: the folded-inline COMDAT exception (docs/campaign_house_rules.md:29-37, 3c74fa36; ruling #2): the new _point_from_line3d is byte-identical, the callers are strictly exact at 36/36, and the provider link passes. 06: the objects.c tentative-definition precedent (Matching), with per-symbol linker_common evidence.
|
||||
- completes_object: False
|
||||
- differences: 06 rests on per-symbol COMMON, /Od and 2001-map evidence rather than pool adjacency, but the 2026-09-22 canonical reconciliation excluded an adjacency-only COMMON wave, so the integrator must confirm the evidence standard. git apply --check passes for 05 and 06.
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/patches/05_render_debug_genuine_helpers_and_vehicle.patch, 06_OPTIONAL_E_render_debug_tentative_debug_toggles.patch (apply one at a time)
|
||||
- evidence: docs/campaign_house_rules.md:29-37. docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:69-75. research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/RULING.md Q2e and APPLY_ORDER.txt.
|
||||
|
||||
## source/bitmaps/bitmap_drawing — HELD_CLASS
|
||||
|
||||
- construct: An unreferenced 16-byte initialised .data prefix (ff x10, 00 x6) before the public translation_table. It needs a name and a type.
|
||||
- precedent: AB owner-rulings table #14 (data lane): 'An unreferenced global January defines: admitted only with verified owner, type, value and linkage from January's own cachebeta.pdb; unnamed globals HELD'.
|
||||
- completes_object: True
|
||||
- differences: None. The owner is proven (section contributions), but the type is unrecoverable (char[10], short[5] and long[3] all give the same layout), and there is no name in HCEX, the atlas, the Sept-2001 maps or /Od. A yes on a named and typed global would complete the object (7/7 exact; the data gap is the whole 2,644 B section).
|
||||
- packet: None (no admissible packet; do not invent an extent-filling global)
|
||||
- evidence: docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:330. docs/object_matching_logs/bitmap_drawing_prefix_evidence_20260924.md.
|
||||
|
||||
## source/objects/object_lights — HELD_CLASS
|
||||
|
||||
- construct: Q1: admit the surplus _object_get_bounding_sphere COMDAT, whose two __FILE__ DIR32 targets point to object_lights' own c:\halo\source\objects\objects.h literal instead of January's selected ..\objects\objects.h.
|
||||
- precedent: Brief section 8 lists the 'object_lights __FILE__ surplus' as owner-gated. The rule-6 exception text requires the emitted copy to be byte-identical to January's selected copy.
|
||||
- completes_object: True
|
||||
- differences: The rule-6 exception condition is not met: 7 of 9 relocation targets are identical and 2 __FILE__ targets differ. The packet asks for a new exception class (an authentic non-identical surplus, proven by January's single orphan literal). A yes completes the object (43/43, audit PASS).
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/patches/01, 02, 03_YES, 04_YES (all git apply --check OK)
|
||||
- evidence: docs/campaign_house_rules.md:29-37. WORKER_BRIEF_R2.md:191-195. research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/RULING.md Q1.
|
||||
|
||||
## source/objects/object_lights — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Ruling-independent parts: 01+02 (should_render_lights, light_attenuation and cluster_get_first/next_light made static per cachebeta; the /Od-attested should_render_lights() calls) and 03_NO_ALT (_lights_section single-section data entry with allow_incomplete_unit, +1,541 data).
|
||||
- precedent: Storage follows cachebeta publics (05255584). The leaf_map allow_incomplete_unit single-section data entry (config/semantic_data_matches.json, ae12a3c1).
|
||||
- completes_object: False
|
||||
- differences: None. 01 and 02 must land together with a csplit regen. Use 03_NO_ALT only if Q1 is refused or undecided (03_YES replaces it on a yes).
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/patches/01_object_lights_static_helpers.patch, 02_object_lights_symbols_json.patch, 03_NO_ALT_object_lights_semantic_data_entry_incomplete.patch (all git apply --check OK)
|
||||
- evidence: research/fifty_objects_20260925/w/owner_queue/objlights_render_debug/APPLY_ORDER.txt ITEM 1. config/semantic_data_matches.json leaf_map entry.
|
||||
|
||||
## source/game/game_engine — HELD_CLASS
|
||||
|
||||
- construct: Admission pick. Q1: the alias versus the /Od view copy `positions[count] = *(real_point2d *)&global_goal[goal_index].position;`. Q2: the one-consumer focused headers. Q3: the anonymous debug_player_color aggregate with word pad members, plus the descriptive .bss names _game_engine_teleport_message_ticks and _game_engine_teleport_flash_fade_function.
|
||||
- precedent: Q3: brief section 9 (pad members signal an invented aggregate) and the descriptive-name hold. Brief section 8 lists the game_engine pick as owner-gated. Q1-B itself IS the 3ba2eb91 action_obey aggregate-copy class, and Q2 is governed by ruling #4.
|
||||
- completes_object: True
|
||||
- differences: Q1-B meets every 3ba2eb91 condition: /Od 0x5a20e0 is an 8-byte integer mov pair with no pointer slot, the layout is a compatible prefix, the function is 180/180 strict exact, and the member-wise spelling is residual with the same non-strip-testable caveat. So Q1 can be settled by precedent in favour of B. Q2: ruling #4 selects variant_no_single_consumer_headers, but hud_nav_points.h is still an invented header (the genuine hud.h move breaks _populate_statistic_buffer by count). Q3 keeps the object held: HCEX records the flash values as static locals red/green/blue/duration of game_engine_update_teleporter, which contradicts one aggregate. A yes on Q3 (and on the hud_nav_points.h header) would complete the object.
|
||||
- packet: research/fifty_objects_20260925/w/owner_queue/pick_game_engine/patches/optionB + variant_no_single_consumer_headers (re-sweep against current game_engine.h consumers)
|
||||
- evidence: git show 3ba2eb91 (action_obey caveat). source/ai/action_obey.c:1259. research/fifty_objects_20260925/w/owner_queue/pick_game_engine/RULING.md Q1-Q3. docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:79-80.
|
||||
|
||||
## source/items/weapons — HELD_CLASS
|
||||
|
||||
- construct: (A) _weapon_place keeps its authentic long return and is bound to the void datum_place slot with a BUG comment. (B) A descriptive profile_section static name, _weapon_update_section.
|
||||
- precedent: Brief section 2 ('Reproducing an authentic January bug needs ... owner approval - report, don't land'); Lane D class F (return ABI), which is unruled. For (B), the 2026-09-15 no-descriptive-static-names ruling.
|
||||
- completes_object: True
|
||||
- differences: None: the round-1 reviewer placed a policy hold on both. The new evidence (long in two HCEA/HCEX PDBs, the cast byte-inert, the units regression gone) justifies a re-ask, not a self-admission. A yes on both completes the object (p1+p2+p3 atomically with a csplit regen).
|
||||
- packet: research/fifty_objects_20260925/w/weapons/p1_weapons_c.patch, p2_owner_header.patch, p3_symbols_json.patch (all git apply --check OK; held)
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_items_weapons.md issues A-D. docs/object_matching_logs/claude_lane_d_refresh_HANDOFF_20260922.md:139 (class F).
|
||||
|
||||
## source/items/weapons — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit storage: "static": true on 11 symbols.json rows, plus static on the weapon_magazine_finish_reload prototype (weapons.c:449) and definition (:1382).
|
||||
- precedent: Storage follows cachebeta publics (05255584). The first-party Sept-2001 cachebeta.map 'Static symbols' lists these as static functions.
|
||||
- completes_object: False
|
||||
- differences: None. The result is 78/79 with object_audit 97/0 (only _weapon_place fails). symbols_static.diff is a plain line diff, not a git patch; its lines 4013-4054 still match HEAD.
|
||||
- packet: research/fifty_objects_20260925/w/weapons/symbols_static.diff (apply by line surgery) + `static` at source/items/weapons.c:449 and :1382, then a csplit regen
|
||||
- evidence: research/fifty_objects_20260925/results/wave1/REVIEW__source_items_weapons.md 'Admissible now without a ruling'. TRIAGE__source_items_weapons.md why_new (Sept-2001 map).
|
||||
|
||||
## source/networking/network_connection — HELD_CLASS
|
||||
|
||||
- construct: (1) _network_server_close_client_connection: the authentic N+1 capacity loop bound, which reads one past the list. (2) _network_connection_connect: a redundant unreliable-arm `success = TRUE;`.
|
||||
- precedent: (1) Brief section 8 (every January-bug candidate: overruns) and structural packet s4. (2) AB table #9 (semantically inert steering rejected), and structural packet s6 recommends rejecting it.
|
||||
- completes_object: True
|
||||
- differences: None. (1) is a reachable out-of-bounds read, the class Lane C R10/R14(c,d) held. (2) is attested only by January's block layout; the 2020 build has no such path, and it fails the strip test. A yes on both completes the object (23/23, audit PASS).
|
||||
- packet: Held: research/fifty_objects_20260925/w/network_connection/production.patch + owner_gated_close_client.patch
|
||||
- evidence: docs/object_matching_logs/claude_structural_owner_packet_20260923.md:120, 146-151. docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:325-326.
|
||||
|
||||
## source/text/draw_string — HELD_CLASS
|
||||
|
||||
- construct: _bitmap_draw_string: January's inverted `if (!bounds)` test followed by bounds-> reads (a NULL dereference), with a BUG comment.
|
||||
- precedent: Brief section 8 (January-bug class: NULL dereference). Lane C R10: reachable UB is held even when exact.
|
||||
- completes_object: True
|
||||
- differences: None. /Od 0x8b2090 corroborates the inverted test, but reachable UB stays held. A yes plus the ownership packet completes the object (28/28).
|
||||
- packet: Held: research/fifty_objects_20260925/w/draw_string/bug_body_after_ownership.patch (git apply --check OK)
|
||||
- evidence: WORKER_BRIEF_R2.md:185-190. C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/lane_c/owner_rulings.md:140-145 (R10).
|
||||
|
||||
## source/text/draw_string — COVERED_BY_PRECEDENT
|
||||
|
||||
- construct: Zero-credit ownership packet: split the invented _draw_string_globals into four HCEX-attested file statics with `= { 0 }` ordering.
|
||||
- precedent: a595bbc2 (models: `= { 0 }` file statics restoring January's .bss order, with authentic names). R2 batch 1a 7979cf8f (first-party names).
|
||||
- completes_object: False
|
||||
- differences: None: the names are HCEX-attested. symbols_json.patch fails git apply --check at config/symbols.json:23268 and must be re-cut in place (line 23279 is still _draw_string_globals). ownership.patch applies.
|
||||
- packet: research/fifty_objects_20260925/w/draw_string/ownership.patch + symbols_json.patch (regenerate) + csplit regen
|
||||
- evidence: docs/object_matching_logs/models_obj_explicit_zero_bss_owner_20260924.md. git show a595bbc2 and 7979cf8f.
|
||||
|
||||
## source/bungie_net/network/transport_endpoint_set_winsock — HELD_CLASS
|
||||
|
||||
- construct: (1) _poll_endpoint_set: a staging boolean `select_failed = select_result < 0 || select_result == SOCKET_ERROR` that no /Od body attests. (2) _transport_initialize: explicit zero field stores. (3) net_startup_debug static reached only through an invented call.
|
||||
- precedent: (1) AB table #9 (a flag whose only effect is bytes is rejected) and structural packet s7 (held). (3) The round-1 review rejected the invented call as a fake dependency. (2) has no precedent.
|
||||
- completes_object: False
|
||||
- differences: (2) is attested in January bytes and 3 builds but is still one byte short, so it would need a NEW ruling and would close nothing. compare_entries is an EAX/ECX tie (RETIRE). The object cannot complete even if every item is a yes.
|
||||
- packet: Held: research/fifty_objects_20260925/w/transport_endpoint_set_winsock/owner_gated.patch. storage_only.patch passes git apply --check (zero-credit storage).
|
||||
- evidence: docs/object_matching_logs/claude_structural_owner_packet_20260923.md:163-164. docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:325.
|
||||
|
||||
## source/bungie_net/network/transport_endpoint_winsock — HELD_CLASS
|
||||
|
||||
- construct: _connect_endpoint_process@4: January's uninitialised `struct thread_reference *thread;` is read on take_mutex failure, with a BUG comment.
|
||||
- precedent: Brief section 8 (January-bug class: uninitialised reads). Structural packet s4 row, unruled.
|
||||
- completes_object: True
|
||||
- differences: None. The failure path is reachable, so the Lane C R13/R14(a) 'provably irrelevant' admissions do not apply. A yes completes the object (30/30).
|
||||
- packet: Held: cand_final body. research/fifty_objects_20260925/w/transport_endpoint_winsock/production.patch no longer applies (it fails at transport_endpoint_winsock.c:340 because the storage part already landed); regenerate a bug-body-only hunk from cand_final.vs_tree.diff.
|
||||
- evidence: docs/object_matching_logs/claude_structural_owner_packet_20260923.md:111. WORKER_BRIEF_R2.md:185-190.
|
||||
|
||||
## source/game/players — HELD_CLASS
|
||||
|
||||
- construct: _player_examine_nearby_device: a decoration-only parenthesis on the fast_vector_intersects_sphere radius, now proposed as a same-name callee wrapper macro in real_math.h.
|
||||
- precedent: RB2 explicit owner refusal (2026-09-21) of this very function.
|
||||
- completes_object: False
|
||||
- differences: None, and the wrapper form is worse. It edits the RESERVED real_math.h and real_math.c, and it deletes the owner-admitted LINE_OF_FIRE_PILL_SPHERE_RADIUS accessor from ai.c, reverting 73c05198. No first-party name exists. _player_teleport_internal is RETIRE, so the object cannot complete.
|
||||
- packet: None (research/fifty_objects_20260925/w/players/owner_gated_wrapper_macro.patch must not land)
|
||||
- evidence: docs/object_matching_logs/claude_lane_b_rejected_hypotheses_20260920.md:45-56. research/fifty_objects_20260925/w/players/owner_gated_wrapper_macro.patch (removes ai.c:316-330).
|
||||
|
||||
## source/physics/collisions — HELD_CLASS
|
||||
|
||||
- construct: _collision_move_point: the genuine real_math.h __inline valid_real_plane3d body plus the /Od function-scope `position`. It loses _rasterizer_frame_statistics_draw (4,176) and _bitmap_copy.
|
||||
- precedent: Declaration-count-loss class: ruling #4 requires zero regressions, and canonical rejected the identical frame_statistics loss on 2026-09-24 (the distance3d header body). real_math is RESERVED for Codex.
|
||||
- completes_object: True
|
||||
- differences: None: the same victim function, and no count from -6 to +30 restores it. The rejected focused-header/block-scope packet must not be re-offered. The collisions.c bare parenthesis (now line 1581) is itself under RB2 review.
|
||||
- packet: Held: research/fifty_objects_20260925/w/collisions/production.patch (git apply --check OK)
|
||||
- evidence: docs/object_matching_logs/claude_object_closure_canonical_reconciliation_20260924.md:43-50. research/fifty_objects_20260925/results/wave1/REVIEW__source_physics_collisions.md.
|
||||
|
||||
## cross-cutting (real_math.h / _rasterizer_frame_statistics_draw) — HELD_CLASS
|
||||
|
||||
- construct: The owner question 'accept losing _rasterizer_frame_statistics_draw (exact only at today's declared-name count) to land genuine real_math.h bodies' (collisions valid_real_plane3d, breakable B1 real_local_random).
|
||||
- precedent: Canonical 2026-09-24: the genuine distance3d body was rejected because the sweep lost this exact function. Ruling #4 requires zero regressions. Layer 2 (931ed8dc) was accepted only because it preserved this function's exactness.
|
||||
- completes_object: False
|
||||
- differences: None. Canonical has already declined the same trade. It needs the owner to reverse that stance or a funded frame_statistics genuine-declaration attack, sequenced after the Codex real_math report.
|
||||
- packet: None
|
||||
- evidence: docs/object_matching_logs/claude_object_closure_canonical_reconciliation_20260924.md:43-50. docs/object_matching_logs/claude_fifty_objects_20260925.md:81-130 (Layer 2 strip test R6 V1).
|
||||
|
||||
## source/physics/collision_bsp — HELD_CLASS
|
||||
|
||||
- construct: _collision_surface_test_sphere: a unit-local SSE __asm fast_distance_squared3d macro.
|
||||
- precedent: 2026-09-15 owner ruling: the collision_bsp SSE __asm macro stays parked.
|
||||
- completes_object: False
|
||||
- differences: None. Two bsp3d parity residuals (RETIRE) and the RESERVED Codex P1 _cross_product2d dependency also remain.
|
||||
- packet: None (research/fifty_objects_20260925/w/collision_bsp/owner_gated_asm.vs_tree.diff held)
|
||||
- evidence: docs/object_matching_logs/opus5_250k_house_clean_checkpoint_20260915.md:22-24.
|
||||
|
||||
## source/math/geometry — NEW_RULING_NEEDED
|
||||
|
||||
- construct: (a) polygon2d: the /Od 0x6bf170 plane2d_distance_to_point body `dot_product2d((real_vector2d *)point, &plane->n) - plane->d` as a real_math.h header view cast. (b) _convex_hull3d_expand: pointers formed before the range checks.
|
||||
- precedent: (a) Ruling #3 (per-site rule-24 admission) and e942f338 (realcmp consolidated in real_math.h). (b) The January-bug/UB class (structural packet s4), which is HELD.
|
||||
- completes_object: False
|
||||
- differences: (a) The cast would live in a shared header body, so every consumer instantiates it. real_math.h is RESERVED for Codex, and the full-board sweep has not been measured at HEAD. Structural packet s3 decision (b) ('admit the geometry cast') is unanswered, so ruling #3's strict-exactness and zero-regression conditions are not yet shown. (b) is HELD_CLASS (UB). The object also needs the Codex P1 and a decals _plane2d_from_points provider repair (decals is closed this lane), so it is not completable.
|
||||
- packet: Held: C:/halo-worktrees/claude-lane-d-refresh-20260922/scratch/lane_d/w/math__geometry (B3, h3e_c1)
|
||||
- evidence: docs/object_matching_logs/claude_structural_owner_packet_20260923.md:76-101 and :117. git show e942f338. docs/object_matching_logs/claude_lane_b_HANDOFF_20260920.md:76-78.
|
||||
|
||||
## source/tool/connected_geometry — HELD_CLASS
|
||||
|
||||
- construct: (a) _connected_geometry_find_or_add_edge: an uninitialised `boolean direction;` (/Od _RTC_UninitUse("direction")).
|
||||
- precedent: Brief section 8 (January-bug class: uninitialised reads). Structural packet s4 (the RTC-attested class admission is unanswered).
|
||||
- completes_object: False
|
||||
- differences: A closer owner precedent exists that could justify a re-ask. Lane C R14(a) (2026-09-21) admitted an uninitialised `long best_axis;` because its unassigned path is unreachable for finite inputs. Here the read happens only when edges.count < 0, which a valid dynamic array never has. The brief still holds the class, so it is not self-admissible. triangle_coplanar is a RETIRE tie, so the object cannot complete.
|
||||
- packet: Held: C:/halo-worktrees/claude-lane-d-refresh-20260922/scratch/lane_d/w/tool__connected_geometry/candidate_ruling_direction.c
|
||||
- evidence: docs/object_matching_logs/claude_lane_d_refresh_manifest_20260922.json (find_or_add_edge blocker text). C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/lane_c/owner_rulings.md:199-215 (R14 a/b admitted). WORKER_BRIEF_R2.md:185-190.
|
||||
|
||||
## source/tool/connected_geometry — NEW_RULING_NEEDED
|
||||
|
||||
- construct: (b) _connected_geometry_find_or_add_vertex: a TU-local realcmp_epsilon(a,b,epsilon) macro copied verbatim from sound_dsound_xbox.c:61.
|
||||
- precedent: e942f338 (realcmp owned by real_math.h because January assert strings attest it). The 5186c5bd inferred TU-private macro rule.
|
||||
- completes_object: False
|
||||
- differences: realcmp_epsilon is not January-string-attested: it is itself an inferred 2026-09-13 macro (2885ba82), and e942f338 left it untouched. A second TU-local copy runs against e942f338's consolidation. Placing it in real_math.h instead would touch the RESERVED unit. The only load-bearing element is the hygienic parenthesisation (plain fabs fails), which puts it close to the RB2/first-party-name condition.
|
||||
- packet: Held: C:/halo-worktrees/claude-lane-d-refresh-20260922/scratch/lane_d/w/tool__connected_geometry/cand_e15_macro.c
|
||||
- evidence: git show e942f338 ('realcmp_epsilon is untouched'). source/sound/sound_dsound_xbox.c:61. docs/object_matching_logs/claude_structural_owner_packet_20260923.md:84-86.
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox_profile — HELD_CLASS
|
||||
|
||||
- construct: B1: de-aggregate the four invented TU-private structs (pad02/pad06/pad12/pad16/reserved06) into loose statics with descriptive .bss names, plus an unattested 4-byte .bss object at +0x45c.
|
||||
- precedent: 2026-09-15 owner ruling (no descriptive or invented static names). Brief section 9 (pad members signal an invented aggregate). AB #14 (unnamed globals HELD).
|
||||
- completes_object: False
|
||||
- differences: None. HCEX has no profile TU statics.
|
||||
- packet: None for B1 (research/fifty_objects_20260925/w/rasterizer_xbox_profile LEDGER P3)
|
||||
- evidence: docs/object_matching_logs/opus5_250k_house_clean_checkpoint_20260915.md:20-31. docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:330.
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox_profile — HELD_CLASS
|
||||
|
||||
- construct: B2: the /Od-attested NONE-branch '### PROFILE: %s -- tell Bernie!' insufficient-varargs defect (/Od 0x8004c0), with a BUG marker.
|
||||
- precedent: Brief section 2 and section 8 (January bug: owner approval required, report and don't land).
|
||||
- completes_object: False
|
||||
- differences: The only canonical landing of an insufficient-vararg bug, ai_script _ai_scripting_migrate_and_speak (5d3444f7, re-disclosed in 8fd76228), is recorded as 'owner ratification required', and no ratification exists in docs. So it is not a covering precedent.
|
||||
- packet: Held: research/fifty_objects_20260925/w/rasterizer_xbox_profile/patches (08 BUG-marker patch per triage)
|
||||
- evidence: docs/object_matching_logs/claude_lane_a_ai_core_HANDOFF_20260920.md:110-137, :328. docs/object_matching_logs/claude_lane_a_ai_core_admission_manifest_20260920.json:78 (owner_ratification_required true).
|
||||
|
||||
## source/rasterizer/xbox/rasterizer_xbox_profile — NEW_RULING_NEEDED
|
||||
|
||||
- construct: B3: confirm the three load-bearing volatile qualifiers already in canonical (rasterizer_xbox_profile.c:184, :215, :284). Stripping them gives 12/16.
|
||||
- precedent: 5e81dabf (2026-09-23): volatile was admitted for cache_files_decompress_windows only because of HCEX/HCEA type-record support.
|
||||
- completes_object: False
|
||||
- differences: No HCEX type record exists for the profile statics (review3 V10), so the admitting condition fails. The only support is the semantic comment about asynchronous D3D callback writes. The ready zero-credit window/API owner patches 01-06 apply cleanly (rule 9 / ruling #4; they need a full sweep of the shared-header consumers). 07 fails at object_admission_rejections.json:17.
|
||||
- packet: research/fifty_objects_20260925/w/rasterizer_xbox_profile/patches/01-06 (zero-credit, git apply --check OK); 07 must be regenerated
|
||||
- evidence: docs/object_matching_logs/fourth_five_objects_admission_20260923.md ('The cache volatile qualifiers have independent HCEX/HCEA type-record support, not a register-forcing guess'). docs/object_matching_logs/claude_structural_owner_packet_20260923.md:63-74.
|
||||
|
||||
## source/interface/hud_draw — HELD_CLASS
|
||||
|
||||
- construct: _fast_ftol_C: a tightly bracketed #pragma optimize("", off)/on around the helper.
|
||||
- precedent: Explicit owner refusal, Lane C R6 (2026-09-21): "Hold it; no pragma. Preserve _hud_draw_meter exactness, record the ready 56-byte candidate, and audit the existing ai.c pragma separately." Also AB #8 ('No #pragma steering, ever') and brief section 2 (the held 'hud_draw optimizer pragma').
|
||||
- completes_object: True
|
||||
- differences: The triage's 'ai.c precedent is admitted' is incorrect. ai.c:2902/3047 is an inherited landing (1a6da50d, 2026-09-09) that Lane A disclosed as not admissible if proposed fresh (R9), and the owner ordered it audited separately. The new non-16-byte COMDAT census is supporting evidence for a re-ask, not a ruling. Separately, the _fast_ftol candidate-only-comdat-owner rejection is still in config/object_admission_rejections.json (around line 21); triage reports it stale. A pragma yes would complete the object.
|
||||
- packet: Held: C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/wave1/hud_draw.c (or opus5 150k_w1 v2.c)
|
||||
- evidence: C:/halo-worktrees/claude-lane-c-graphics-ui-20260920/scratch/lane_c/owner_rulings.md:19-50. docs/object_matching_logs/claude_lane_c_graphics_ui_HANDOFF_20260920.md:216-224. docs/object_matching_logs/claude_lane_a_ai_core_rejected_hypotheses_20260920.md:134-147. docs/object_matching_logs/claude_lanes_AB_HANDOFF_TO_LANE_C_20260921.md:324.
|
||||
|
||||
## source/ai/path_obstacles — HELD_CLASS
|
||||
|
||||
- construct: _obstacles_test_circle: a parenthesised field operand `radius + (disc->radius)` or a TU-private accessor ((disc)->radius).
|
||||
- precedent: Brief section 2 names 'path_obstacles bare-parenthesis match' as a held item never to retry. RB2 and ruling #5.
|
||||
- completes_object: True
|
||||
- differences: None. The 73c05198 named-accessor admission requires a first-party-attested name, and none exists (/Od, the atlas and HCEX have no disc-radius accessor). A yes plus the storage fix below would complete the object. Separately covered at zero credit: `static` on _global_obstacle_colors plus "static": true at symbols.json line 22351 (in place) and a csplit-only regen (absent from cachebeta publics).
|
||||
- packet: None for the paren. Storage fix has no packet file (a triage-described edit to source/ai/path_obstacles.c and config/symbols.json:22351).
|
||||
- evidence: WORKER_BRIEF_R2.md:59-61. docs/object_matching_logs/claude_lane_b_rejected_hypotheses_20260920.md:45-56. docs/object_matching_logs/claude_lane_a_adjudication_paren_accessor_20260920.md:126-135.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
# REVIEW source/bink/bink_playback
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: None
|
||||
|
||||
## per_object
|
||||
null
|
||||
|
||||
## checks
|
||||
All checks were run independently in C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/review_r2w2_bink_playback/ (REVIEW.md, LEDGER.md) at HEAD 434f0151. That is 05255584 plus a docs-only commit; the tree is clean.
|
||||
|
||||
- Patch integrity: git apply --check at HEAD returns rc 0 for PACKET, 01 and 02 separately. Applying and then reversing on the LF HEAD blobs gives byte-identical files. PACKET is byte-equal to 01+02, and the sha256 values match patches_sha256.txt. The edited symbols.json rows are 23308, 23309, 23310 and 23313, changed in place.
|
||||
- Split emulation: a control csplit from an unmodified config copy matches build/split on 833/833 objects. With 02 applied, only bink_playback.obj differs, in exactly 4 bytes: the storage class of symbols 162, 163, 164 and 167 goes from 2 to 3.
|
||||
- PDB storage: cachebeta publics list _debug_bink [004D2B74] and _bink_globals [004D2B78]. Nothing public sits at 0x4D2AF0, 0x4D2B30, 0x4D2B60 or 0x4D2C50. No object in build/split or build/base has an UNDEF reference to any of the four; the only UNDEF among the six is _debug_bink in hs_globals_external. No other source file or header names the four. HCEX.pdb has no entries (bink stubs only).
|
||||
- Gate: 23/1 for production and 23/1 for the candidate, with the same row (_bink_query_analog_controller_buttons, parked q3). Compared cand.obj with prod.obj on all 77 non-debug sections using section_infos_equal: 0 section diffs, and only the 4 storage bytes differ in the symbol table.
|
||||
- object_audit: prod against split is FAIL(1), and cand against the emulated split is FAIL(1). Both have 59 symbols with 0 differing, and .bss (356/356) and .data are ok. The mixed pairs are FAIL(5) each, so the two halves must land together.
|
||||
- pdb_storage goes from 5 to 1; the remaining one is _code_001b5850. surplus_identity finds 0 code COMDATs. provider_link passes in both orders for 3 SDK tables and 3 __real literals.
|
||||
- objdiff 3.3.1 (sha1 3130e428) mini report: prod, cand and both mixed pairs are identical at 3733/3803 code, 23/24 functions and 1701/1701 data.
|
||||
- /Zs /W3 gives 14 warnings for both. fake_match_scan reports the same pre-existing int 3 lead for both.
|
||||
- No board sweep was needed: no header changed, no other translation unit includes bink_playback.c, configure.py does not read symbols.json, and the emulated split changes only this object.
|
||||
- Strip tests: removing `static` leaves the bytes the same but brings back 4 storage DIFFs against the PDB-derived split. A lab strip of the `= { 0 }` initialisers (already in the file, not added by this packet) moves the .bss layout from 356 to 360 bytes and shifts 6 symbol offsets. That follows the VC7 initialised-statics law, and canonical already accepts it.
|
||||
- Precedent: I read the original cdc8ebd3 diff (Batch 5b, collision_bsp_usage_times made static with its symbols.json row set static:true, zero credit). Every condition holds here: absent from publics, 0 UNDEF references, byte- and credit-neutral, landed atomically with a csplit-only regen, and no extern in any header.
|
||||
|
||||
## issues
|
||||
None blocking. The packet is a correct zero-credit storage-class fix.
|
||||
|
||||
- It needs an atomic landing: source and symbols.json together, then a csplit-only regeneration. Landing either half alone gives 4 storage DIFFs.
|
||||
- It does not complete the object. Two owner items remain unchanged:
|
||||
- _bink_query_analog_controller_buttons still waits on the q3 owner ruling (parked).
|
||||
- _code_001b5850 keeps its address-derived name, which is a house-rule naming item. It is non-public and unreferenced, which fits a January static that was used but inlined everywhere. Making it static in our source drops the section, because our source never calls it.
|
||||
- The original scope asked me to gate every January function against the emulated split. gate.py has build/split hardcoded, so I compared the candidate with the emulated split through a copy of object_audit (every section and symbol). I ran gate.py only against build/split. That is equivalent here, because the split change is 4 symbol-table bytes and touches no section.
|
||||
- The worker brief named base 05255584; HEAD is now 434f0151, which adds one docs-only commit, and the packet applies cleanly there.
|
||||
- No amended patch is needed.
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
# REVIEW source/effects/weather_particle_systems
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch: None
|
||||
|
||||
## per_object
|
||||
[
|
||||
{
|
||||
"unit": "source/effects/weather_particle_systems patch 01 (one_over_char_max static -> external)",
|
||||
"approve": true,
|
||||
"issues": "None blocking. cachebeta public 0x25AAFC, HCEX Global/exported, January split storage 2. Byte- and credit-neutral: 0 section diffs, 1 storage bit. object_audit symbols go from 29/30 to 30/30 and pdb_storage from 2 to 1. The hs precedent is overstated (hs had a cross-object consumer), but the public=external rule, the ui_widget _one_over_255 no-consumer precedent and HCEX cover it. No symbols.json change is needed."
|
||||
},
|
||||
{
|
||||
"unit": "source/effects/weather_particle_systems patch 02 (weather_particle_system_globals external -> static + symbols.json row 22981)",
|
||||
"approve": true,
|
||||
"issues": "Optional. It must land atomically with the symbols.json row and a split regeneration; either half alone fails object_audit. Evidence: absent from cachebeta publics (neighbours are public) and HCEX File Static, stronger than cdc8ebd3. It reverses f7afb704's circular choice. With the emulated split, pdb_storage is 0 and audit shows 30/30 symbols with 0 differing; combined with the round-1 owner item it gives object_audit PASS, 20/20. Advisory: the pre-existing = { 0 } becomes audit-inert once the variable is static; the precedent keeps it. The edited lines are LF in a CRLF worktree after git apply; staging normalises this."
|
||||
}
|
||||
]
|
||||
|
||||
## checks
|
||||
All checks were run independently in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2w2_weather_particle_systems\ (see REVIEW.md). I claimed the unit, then released it. No tracked file was edited and nothing ran ninja, configure or a git mutation. The tree is clean apart from the pre-existing untracked research/ folder.
|
||||
|
||||
(1) Patches. I rebuilt the candidates from the patch files, not from the worker's .c files: git show HEAD into an isolated autocrlf=true repo, then applied 01 and then 02. The results equal the worker's files: candA.c = cand.c, candB.c = candB.c, symbols_B.json = emu/config/symbols.json. Against production, only l.309 and l.313 of the source and l.22981 of symbols.json change. git apply --check is clean at HEAD 434f0151 for 01, for 02 and for 01+02; the HEAD blobs d2aae8ff / f9abb17d are the patches' index bases.
|
||||
|
||||
(2) gate --all. prod, candA and candB give identical rows: 19 EXACT plus _weather_particle_system_render 1680 residual [sha].
|
||||
|
||||
(3) objcmp (sections by section_infos_equal and raw bytes, plus the full symbol table):
|
||||
- build/base vs prod: 0/0.
|
||||
- prod vs candA: 0 section diffs, 1 symbol diff (_one_over_char_max storage 3->2).
|
||||
- candA vs candB: 0 section diffs, 1 symbol diff (_weather_particle_system_globals storage 2->3).
|
||||
|
||||
(4) Emulated split, my own csplit run. The control config reproduces build/split for all 833 objects. cfg_B (row 22981 plus "static": true) changes only the weather object, by one storage bit, with 30/30 sections identical.
|
||||
|
||||
(5) object_audit (copy with a parametric split root):
|
||||
- Against build/split: prod FAIL(2); candA FAIL(1), render only, 30 symbols with 0 differing; candB FAIL(2) on globals.
|
||||
- Against emu split_B: prod FAIL(3); candA FAIL(2) on globals; candB FAIL(1), render only, 0 differing.
|
||||
- This proves 02 is atomic.
|
||||
- All 10 data sections are ok in every run.
|
||||
|
||||
(6) pdb_storage: prod 2, candA 1, candB vs emu split 0.
|
||||
|
||||
(7) surplus_identity is unchanged: 13/14 IDENTICAL; _real_local_random DIFFERENT, as before.
|
||||
|
||||
(8) provider_link on prod, candA and candB gives the same FAIL(1) on _real_local_random vs effects.obj, in both orders. With --baseline, all three PASS.
|
||||
|
||||
(9) Symbol census across 621 base and 833 split objects: weather is the only definer of either symbol, and nothing else references them. A relocation scan of the neighbours (_player_effect_globals, _cheat_strings, _debug_*) finds only addend 0, so there is no aliased reference into weather's globals. No January relocation targets _one_over_char_max (defined but unused, as in our source).
|
||||
|
||||
(10) HCEX DIA2Dump re-run: one_over_char_max is Global const float, PublicSymbol, export is DATA; weather_particle_system_globals is File Static. cachebeta publics: _one_over_char_max is public at 0x25AAFC; the globals symbol is absent while its neighbours 0x43D588/89 are public.
|
||||
|
||||
(11) /W3: 15 warnings with an identical set for all three sources. fake_match_scan: 0 leads.
|
||||
|
||||
(12) objdiff 3.3.1 (sha1 3130e428) mini project, 6 units (prod/candA/candB vs build/split and vs emu): all give 4114/5779 code, 19/20 functions, 949/949 data; render 84.86602 everywhere. Credit-neutral.
|
||||
|
||||
(13) Precedent audit. I read 6e3e2d35 and its round-1 hs storage review, cdc8ebd3 (collision_bsp), 4f4c8502 (ui_widget _one_over_255 and the origin of weather's static), donor 3e84a6de, f7afb704, and the 0907 weather delete ledger.
|
||||
|
||||
(14) Future-closure lab: round-1 production.patch plus 02 gives 20/20 EXACT and object_audit PASS against the emulated split. Strip test of the pre-existing `= { 0 }` on the now-static globals: it is inert (see issues).
|
||||
|
||||
(15) EOL simulation (iso2): with a CRLF worktree, staging normalises to LF blobs and git diff --cached --check is clean.
|
||||
|
||||
(16) Rebased the round-1 owner-item body patch and verified it: it applies after 01 and after 01+02, and reproduces the lab files exactly.
|
||||
|
||||
## issues
|
||||
No blocking issues. Both patches are zero credit; the object stays NonMatching on the render class-I owner item and on the _real_local_random provider (real_math is reserved for Codex).
|
||||
|
||||
Precedent check (special focus): the manifest overstates the hs 6e3e2d35 analogy. The hs _hs_type_*_default flips had an extra leg weather lacks: January's hs_runtime.obj imports all 39 as UNDEF, a cross-object consumer. The landing still holds without that leg:
|
||||
- the brief s3/s4.3 public=external rule alone is sufficient (S_PUB32 exists only for externals; 1,709 unreferenced externals are public);
|
||||
- canonical 4f4c8502 landed the exact no-consumer analogue, `real const _one_over_255` in ui_widget.c;
|
||||
- HCEX independently records one_over_char_max as Global and exported;
|
||||
- the weather `static` came from donor 3e84a6de with no storage justification, before the cachebeta rule (2535f91a).
|
||||
So the precedent is not stretched.
|
||||
|
||||
02 (optional) has stronger evidence than its precedent cdc8ebd3, since it has cachebeta absence plus HCEX File Static. It reverses f7afb704's circular split-following choice, which the 0907 ledger had already flagged as unproven. It must land atomically with symbols.json row 22981 and a split regeneration; either half alone fails object_audit (measured).
|
||||
|
||||
Advisory, non-blocking:
|
||||
(a) Once the globals are static, the pre-existing `= { 0 }` no longer affects audit or credit. The strip lab keeps 19 EXACT and 30/30 symbols; only our internal section order changes. Lane C added it to keep an uninitialised external out of COMMON, which no longer applies. The cdc8ebd3 precedent kept the identical form, so I do not require removing it.
|
||||
(b) The MANIFEST says "CRLF kept" for the emu symbols.json, but the edited line is LF in the worker's copy and in any CRLF worktree after git apply. Harmless: the canonical blobs are pure LF, staging normalises, and git diff --cached --check is clean.
|
||||
(c) Integration hazard: after 01 lands, research/fifty_objects_20260925/w/weather_particle_systems/production.patch no longer applies, because its first hunk is 01. A verified body-only rebase for the owner item is at C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2w2_weather_particle_systems\r1_render_body_after_01.patch. It applies after 01 and after 01+02 and reproduces 20/20 EXACT; it is not part of this packet.
|
||||
|
||||
No amended patch is needed. Land C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\r2w2_weather_particle_systems\patches\01_one_over_char_max_external.patch as-is. Optionally land 02_weather_particle_system_globals_static.patch as-is, as one atomic commit with the split regenerated. Full review: C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2w2_weather_particle_systems\REVIEW.md
|
||||
@@ -0,0 +1,50 @@
|
||||
# REVIEW source/items/projectiles
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch:
|
||||
|
||||
## per_object
|
||||
null
|
||||
|
||||
## checks
|
||||
All run independently at HEAD 434f0151. Evidence is in C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/review_r2w2_projectiles/ (REVIEW.md plus raw outputs).
|
||||
(1) gate.py --all on production source: 29 EXACT. The only residual is _projectile_new 432 [sha], with an active park. The fresh compile matches build/base in 0/121 non-debug sections.
|
||||
(2) object_audit on base and on the fresh object: FAIL(1). The only DIFF is .text _projectile_new. .data ok 1548/1548, flags eq, align 4/4. 55 January symbols, 0 differ.
|
||||
(3) pdb_storage: 0 disagreements.
|
||||
(4) surplus_identity: 25 COMDATs, 0 not identical.
|
||||
(5) provider_link: PASS in both orders for all 56 surplus names, including the normal (game) and gravity (particles) literals.
|
||||
(6) Data section: split sec#54, base sec#3 and the fresh object all have 1548 B, flags 0xc0400040, 6 DIR32, sha 7bfaf5fb. Owners _projectile_update_section@0 and _effect_marker_names@1528 are static on both sides. section_info_resolved gives split==base==fresh, and section_infos_equal is True.
|
||||
(7) The two literals January leaves UNDEF (@1528 normal, @1544 gravity) are select-any (selection 2) COMDATs in ours, with identical bytes and flags to January's game.obj and particles.obj providers.
|
||||
(8) My own objdiff 3.3.1 (3130e428) mini report:
|
||||
- January vs itself: .data 99.7416.
|
||||
- Production and fresh: 99.096275, which equals report.json.
|
||||
- '$'->'_' in both objects: 100.0.
|
||||
- Negative control, rename plus one tampered payload byte: 99.93557.
|
||||
- The same objects under 3.6.0 (the configure.py pin) score production .data 100.0 natively, so the entry is a verified no-op under the pinned scorer and cannot break a fresh-worktree progress run.
|
||||
(9) In-memory progress emulation with the real pass order on a patched copy of the manifest:
|
||||
- +1 data exception, +1548 (halobetacache 2,583,826 -> 2,585,374).
|
||||
- Code, functions and complete_units (502) unchanged.
|
||||
- Only projectiles changes, 0 revoked, parks 83/0/0, and the unit stays incomplete.
|
||||
- Admission audit is identical with and without the entry.
|
||||
(10) Verifier negative controls: a wrong sha, relocation count, size, unit, or a missing allow_incomplete_unit each fail closed.
|
||||
(11) Patch checks:
|
||||
- git apply --check passes on the worktree, with --cached, and with --whitespace=error-all.
|
||||
- The patch is ASCII and LF.
|
||||
- Applying it to the HEAD blob reproduces packet/semantic_data_matches.json byte for byte (ca9e110f).
|
||||
(12) The round-1 rule-6 production.patch still gates 29/1, and its .data stays resolved-equal.
|
||||
(13) Precedent audit, read at the original commits:
|
||||
- 84414a1a introduced the opt-in for exact data in incomplete units, first used for objects while that unit was incomplete.
|
||||
- fcd8e378 render_particles uses the identical profile-section plus UNDEF-literal mechanism.
|
||||
- 88d0bd31 race doc l.21-22 says data only, with no completion and no code credit.
|
||||
- 5019c186 editor_flying_camera is an owner commit made after the 3.6.0 retirement. It added a new allow_incomplete_unit entry while the unit was NonMatching with a parked code residual.
|
||||
- ae12a3c1 leaf_map: the quotes at ten_more l.38-45 and reconciliation l.55-56 are verbatim.
|
||||
- No rejection row and no existing entry for this unit. No source, header or symbols.json change, so the strip test, /Od declaration order and house rules do not apply.
|
||||
|
||||
## issues
|
||||
Nothing blocks this. Every condition in the precedent holds, and the policy is not stretched. Four notes for the integrator:
|
||||
(a) MANIFEST.md says projectiles is a 'stronger' case than leaf_map. That is imprecise. leaf_map had all 25/25 functions exact and was incomplete only because of a provider conflict; projectiles has a parked code residual. The owner's incomplete-unit data policy covers that case explicitly: 5019c186 editor_flying_camera (parked residual, data-only opt-in, added after the 3.6.0 retirement), 88d0bd31 race, and fcd8e378 render_particles, which uses the identical UNDEF-literal profile-section mechanism. The integration ledger should cite those as the closest precedents.
|
||||
(b) docs/objdiff_data_relocation_defect_20260922.md says 'do not add new adjudications'. The owner's later practice supersedes that: 20+ entries were re-added on 09-23, including the new camera opt-in. Brief section 4.5 also prescribes this route under the frozen 3.3.1 scorer. Under the pinned 3.6.0 the entry is a no-op.
|
||||
(c) The hunk context is the last array entry (units). If any other manifest append lands first, regenerate the patch from packet/semantic_data_entry.json. No other pending round-2 packet touches the file right now.
|
||||
(d) The credit is +1,548 data bytes only. There is no code or function credit, and the object stays at 29/30. _projectile_new stays owner-gated.
|
||||
The packet patch is approved as submitted: C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/r2w2_projectiles/packet/semantic_data_matches.patch (sha256 4384521a...). No amended patch is needed. The review is at C:/halo-worktrees/claude-fifty-objects-r2-20260924/scratch/w/review_r2w2_projectiles/REVIEW.md.
|
||||
@@ -0,0 +1,62 @@
|
||||
# REVIEW source/items/weapons
|
||||
|
||||
approve: True
|
||||
|
||||
amended_patch:
|
||||
|
||||
## per_object
|
||||
null
|
||||
|
||||
## checks
|
||||
All checks were independent, at HEAD 434f0151. Evidence is in C:\halo-worktrees\claude-fifty-objects-r2-20260924\scratch\w\review_r2w2_weapons\ (REVIEW.md). git status is unchanged; the only untracked entry is the pre-existing research/fifty_objects_r2_20260924/.
|
||||
(1) Patch application:
|
||||
- `git apply --check -v --whitespace=error` is clean for 01, for 02, and for both together.
|
||||
- GNU patch on the HEAD blobs reproduces the worker's cand.c and final/{weapons.c,symbols.json} (CR normalised).
|
||||
- The blob hashes match the patch index lines (72e3597->c0baa42, f9abb17->17bd4c8).
|
||||
(2) Source state: the other 10 functions are already static on both prototype and definition. Only finish_reload was external.
|
||||
(3) Strip test / byte-inertness, with my own byte+reloc comparer:
|
||||
- build/base vs head.obj: 0 section diffs and 0 symbol diffs.
|
||||
- head.obj vs cand.obj: 0 section diffs; the only symbol diff is finish_reload storage 2->3.
|
||||
(4) Split emulation: I ran csplit myself with my own copies of the config.
|
||||
- split_ctl equals build/split for all 833 objects.
|
||||
- split_s differs only in items/weapons.obj, by 11 bytes. These are exactly the 11 storage classes (2->3); all 97 sections are equal.
|
||||
- All 79 function fingerprints (section_infos_equal) are unchanged.
|
||||
(5) gate --all gives identical rows for cand vs split, cand vs split_s and head vs split_s: exact 78, residual 1 (_weapon_place [sha]).
|
||||
(6) object_audit:
|
||||
- production: FAIL(11);
|
||||
- cand vs current split: FAIL(12);
|
||||
- head vs split_s: FAIL(2);
|
||||
- cand vs split_s: FAIL(1), .text _weapon_place only. 97 January symbols, 0 differ. 17 .rdata sections and .data are all ok.
|
||||
This confirms the two patches must land together.
|
||||
(7) pdb_storage drops from 12 disagreements to 1 (_data_00307140, the held naming item B).
|
||||
(8) cachebeta publics:
|
||||
- All 11 are absent, both by name and at their RVAs.
|
||||
- A post-patch census of every symbols.json row in 0xEA400-0xECF00 finds every external row is a public and every static row is not, so the packet is complete for functions.
|
||||
(9) Cross-TU references: my own raw scan for the exact names finds 0 hits outside weapons.obj across 1,454 build/split and build/base objects. Source, headers and the other config files also have 0 hits.
|
||||
(10) Sept-2001 cachebeta.map (sha256 b63d3090, verified): all 11 are under 'Static symbols' (l.20331-20358). The controls are public (l.2299-2316).
|
||||
(11) HCEX DIA2Dump, my own runs:
|
||||
- finish_reload, set_state and reset are 'static function: true';
|
||||
- weapon_busy has no record;
|
||||
- the control weapon_place is a public.
|
||||
(12) surplus_identity: 17 COMDATs, all identical, and the output is identical to production.
|
||||
(13) provider_link against split_s: all 31 rows PASS in both orders, identical to production. `--baseline` finds no new surplus.
|
||||
(14) The semantic_matches pin for _weapon_set_state (sha 667efc08) holds for split_ctl, split_s and cand. The verifier does not depend on storage class.
|
||||
(15) objdiff 3.3.1 (sha1 3130e428, my own mini project): 4 pairings, each 13277/17595 code, 75/79 functions, 2052/2052 data. Per-function rows are identical and match build/report.json.
|
||||
(16) /W3: 20 lines for both head and cand, identical apart from the file name.
|
||||
(17) fake_match_scan: 0 leads for both.
|
||||
(18) Precedent audit. I read the original commits:
|
||||
- f04103c2 is an owner commit. It set symbols.json "static": true on the action_flee/guard private functions, citing "January cachebeta.pdb publics, no cross-TU refs". It also dropped static on aim_assist where January has the function public.
|
||||
- 05255584: hs_runtime converters made static per publics on a NonMatching object, at zero credit. The same commit flagged 13 hardware_geometry rows static.
|
||||
- 7979cf8f: the IsBusy wrappers were flagged static.
|
||||
- 9f74e993 had already flagged weapons' own start_reload and state_next static.
|
||||
|
||||
## issues
|
||||
No defect found; every measured claim reproduced independently. The precedent is not stretched:
|
||||
- Target-side symbols.json static flags per cachebeta publics with no cross-TU references are canonical owner practice (f04103c2, 7979cf8f, 05255584, 9f74e993). Source-side static per publics is also canonical (05255584 hs_runtime, on an object that stays NonMatching).
|
||||
- The joint finish_reload edit is the union of the two directions f04103c2 itself applied.
|
||||
- All seven stated conditions hold: absent from publics; 0 cross-TU references; byte-inert; exact form; the split change is confined to weapons.obj; surplus and provider links unchanged; not a held class.
|
||||
House rules are clean: it is a storage keyword only, with no new scope or declaration, and the strip test restores production bytes.
|
||||
Integrator notes:
|
||||
- Patches 01 and 02 MUST land in the same commit, followed by a full ninja so the split regenerates. Either patch alone makes object_audit worse or leaves it incomplete: FAIL(12) with the source patch only, FAIL(2) with symbols.json only.
|
||||
- The credit is zero. The object stays NonMatching on the owner-held _weapon_place class-F item and the _data_00307140 naming item B, both untouched.
|
||||
- Housekeeping, not caused by this packet: scratch/ holds stale scratch/_gate_<pid>.c/.obj files from the gate.py runs of all workers.
|
||||
Loaded 100 of 554 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user