diff --git a/openspec/changes/replace-scum-projections-with-real-data-management/design.md b/openspec/changes/replace-scum-projections-with-real-data-management/design.md index 68b1812..b9796aa 100644 --- a/openspec/changes/replace-scum-projections-with-real-data-management/design.md +++ b/openspec/changes/replace-scum-projections-with-real-data-management/design.md @@ -38,6 +38,8 @@ The first cross-repository prerequisite is to confirm or add the minimal generic Only then will the production implementation execute bounded, read-only probes through the currently bound Run. For operator-directed discovery, a server-local diagnostic script may read the active database in place on the game server host when it is bounded, query-only, redacted, and recorded as diagnostic evidence rather than a Platform/plugin/browser data path. In both cases, the evidence must include `sqlite_master`, `PRAGMA table_info`, foreign-key/index information for candidate tables, small redacted samples, relevant enum distributions, coordinate ranges/cadence, and read-lock behavior. It must confirm player/profile/entity joins, squad rank meaning, flag ownership relationships, vehicle identity fields, currency types, and whether/where a mutable profile XML payload actually exists. +Current-service schema and log structure baselines are an explicit prerequisite for further adapter or write declarations. The change stores a redacted all-table schema inventory and process-adjacent log pattern inventory under `evidence/`; capability work must consume those local baselines rather than repeatedly probing piecemeal or asking the operator for raw XML/log/database files. + No production query or mutation asset may be merged until the probe evidence is captured in the change or an explicitly referenced test artifact. The probe is diagnostic-only, is not exposed as a browser action, and performs no write. Alternative considered: start with the reference structs and fix queries after deployment. Rejected because the reference models are incomplete hypotheses and the current implementation already failed by treating guessed fields as facts. diff --git a/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-db-schema-baseline-2026-08-13.md b/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-db-schema-baseline-2026-08-13.md new file mode 100644 index 0000000..f5b0934 --- /dev/null +++ b/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-db-schema-baseline-2026-08-13.md @@ -0,0 +1,173 @@ +# SCUM current-service DB schema baseline (redacted compact) + +- diagnostic: scum-current-service-db-schema-compact-v1 +- observed_utc: 2026-08-13T03:26:25Z +- db_path_sha256: 7c3880848ad9c049eeb66769a2b4460fa2c56009d0c022a13362aba8686efbd7 +- file_size_bytes: 80846848 +- mtime_unix: 1786591584 +- table_count: 161 +- redaction: no raw rows, SQL text, XML, host paths, credentials, sockets, IPs, or player identities + +| table | rows | columns | primary_key_columns | foreign_key_count | index_count | +|---|---:|---|---|---:|---:| +| abandoned_bunker | 15 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; location_x INTEGER NN; location_y INTEGER NN; is_day INTEGER NN; time_since_previous_activation_end REAL NN; time_until_activation_start REAL NN; keycard_override_activation_start REAL | id | 2 | 1 | +| abandoned_bunker_alarmed_room | 0 | room_name TEXT NN; bunker_id INTEGER NN; alarm_time_remaining REAL NN | - | 1 | 1 | +| abandoned_bunker_bcu_terminal | 4 | room_name TEXT NN; bunker_id INTEGER NN; last_download_time REAL NN | - | 1 | 2 | +| abandoned_bunker_mesh_instance_bound_to_activation | 0 | abandoned_bunker_id INTEGER PK NN; mesh_instance_name TEXT PK NN; examine_time REAL NN | abandoned_bunker_id, mesh_instance_name | 1 | 1 | +| abandoned_bunker_powered_room | 0 | room_name TEXT NN; bunker_id INTEGER NN | - | 1 | 1 | +| abandoned_bunker_switchboard_fuse | 0 | room_name TEXT NN; bunker_id INTEGER NN; fuse_id INTEGER NN | - | 2 | 2 | +| active_quest | 0 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; quest_data_asset_path TEXT NN; auto_complete BOOLEAN NN; completion_deadline REAL NN; sector TEXT NN; quest_giver_type INTEGER NN; rewards_index INTEGER NN | id | 3 | 1 | +| active_task | 1 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; available_task_id INTEGER NN | id | 4 | 2 | +| ammunition_data | 1673 | id INTEGER PK NN; ammunition_item_entity_class TEXT NN; health REAL NN; max_health REAL NN; default_max_health REAL NN; state INTEGER NN; entity_id INTEGER | id | 1 | 1 | +| ammunition_item_entity | 2754 | entity_id INTEGER PK NN | entity_id | 1 | 0 | +| animal_bait_feeder_item_entity | 67 | entity_id INTEGER PK NN; state INTEGER | entity_id | 1 | 0 | +| available_task | 1 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; task_data_asset_path TEXT NN; was_ever_completed BOOLEAN NN | id | 2 | 1 | +| bank_account_registry | 73 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; account_owner_user_profile_id INTEGER NN; bank_account_number INTEGER NN; save_timestamp INTEGER; used_digital_deluxe_privileges BOOLEAN | id | 3 | 3 | +| bank_account_registry_cards | 92 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; bank_account_id INTEGER NN; card_type TEXT; pin_number INTEGER; wrong_pins_remaining INTEGER; free_renewals_remaining INTEGER; daily_withdraw_amount_remaining INTEGER; daily_deposit_amount_remaining INTEGER; card_entity_id INTEGER | id | 4 | 3 | +| bank_account_registry_currencies | 146 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; bank_account_id INTEGER NN; currency_type INTEGER NN; account_balance INTEGER | id | 3 | 2 | +| bank_general_data | 1 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; last_generated_final_set_of_bank_account_numbers INTEGER; last_withdrawn_amount_reset_timestamp INTEGER | id | 2 | 1 | +| base | 5 | id INTEGER PK; location_x REAL; location_y REAL; size_x NUMERIC; size_y REAL; name TEXT; map_id INTEGER; user_profile_id INTEGER; owner_user_profile_id INTEGER; is_owned_by_player INTEGER; bounds_min_x REAL; bounds_min_y REAL; bounds_max_x REAL; bounds_max_y REAL | id | 2 | 1 | +| base_element | 1533 | element_id INTEGER PK; base_id INTEGER NN; location_x REAL; location_y REAL; location_z REAL; rotation_pitch REAL; rotation_yaw REAL; rotation_roll REAL; scale_x REAL; scale_y REAL; scale_z REAL; asset TEXT; element_health NUMERIC; owner_profile_id INTEGER; quality REAL; creator_prisoner_id INTEGER | element_id | 2 | 2 | +| base_element_coloring | 7 | element_id INTEGER PK; element_part_index INTEGER PK NN; element_color_index INTEGER NN; element_pattern_index INTEGER NN | element_id, element_part_index | 1 | 1 | +| base_element_flag | 5 | element_id INTEGER; overtake_end_time INTEGER; overtaker_user_profile_id INTEGER; expanded_elements INTEGER | - | 2 | 2 | +| base_element_item | 6 | element_id INTEGER PK; item_entity_id INTEGER PK | element_id, item_entity_id | 2 | 2 | +| base_element_shelter_map | 1 | element_id INTEGER PK NN; shelter_id INTEGER PK NN | element_id, shelter_id | 2 | 2 | +| base_raid_protection | 0 | id INTEGER PK NN; manager_id INTEGER NN; base_flag_id INTEGER; data BLOB | id | 1 | 1 | +| base_raid_protection_manager | 1 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; protection_type TINYINT | id | 2 | 1 | +| bcu_lock_registry | 0 | map_id INTEGER NN; user_profile_id INTEGER; server_user_profile_id INTEGER PK NN; bcu_lock_entity_id INTEGER NN; flag_element_id INTEGER NN | server_user_profile_id | 4 | 2 | +| blocked_users | 0 | local_user_id TEXT NN; target_net_id TEXT NN | - | 1 | 1 | +| chest_acquisition | 0 | base_id INTEGER PK NN; entity_id INTEGER PK NN; acquisition_start_time REAL NN; owning_user_profile_id INTEGER | base_id, entity_id | 2 | 2 | +| continuous_usage_entity_component | 21 | entity_component_id INTEGER PK NN; amount FLOAT | entity_component_id | 1 | 0 | +| cooking_instance | 1099 | id INTEGER PK NN; manager_id INTEGER NN; utility_type TEXT; bound_utility INTEGER; bound_recipe INTEGER; ingredients BLOB; temperature REAL; softPeakTemperature REAL; progress REAL; cook_quality INTEGER; owner_utility INTEGER; tag_index INTEGER; internal_coords BLOB; packed_locations BLOB; radius REAL; finished BOOLEAN; can_bound_other BOOLEAN; bounded_to INTEGER; cooked_time REAL; exhaustion_bonus REAL | id | 1 | 2 | +| cooking_manager | 3 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; snapped_keys BLOB; snapped_values BLOB | id | 2 | 1 | +| custom_zone_configuration | 2 | id INTEGER PK NN; map_id INTEGER PK NN; name CHAR(100); color_red REAL; color_green REAL; color_blue REAL; handling_methods BIGINT; settings INTEGER | id, map_id | 1 | 2 | +| custom_zone_configuration_damage_handling_methods | 32 | id INTEGER PK NN; custom_zone_configuration_id INTEGER NN; map_id INTEGER NN; damage_actor_type INTEGER; damage_handling_methods INTEGER | id | 2 | 0 | +| custom_zone_region | 4 | id INTEGER PK NN; map_id INTEGER PK NN; name CHAR(100); location_x REAL; location_y REAL; size_x REAL; size_y REAL; configuration_index TINYINT; default_region_name CHAR(50); default_region_state TINYINT | id, map_id | 1 | 2 | +| db_info | 1 | last_vacuum_time TEXT; next_free_id INTEGER | - | 0 | 0 | +| discrete_amount_entity_component | 13829 | entity_component_id INTEGER PK NN; quantity INTEGER NN | entity_component_id | 1 | 0 | +| dog_tag_item_entity | 0 | entity_id INTEGER PK NN; victim_user_profile_id INTEGER; victim_name TEXT; victim_fame_points INTEGER | entity_id | 2 | 1 | +| door_locking_registry_data | 33 | asset TEXT PK NN; count INTEGER NN; type INTEGER PK NN; map_id INTEGER PK NN; user_profile_id INTEGER PK | asset, type, map_id, user_profile_id | 2 | 1 | +| economy | 1 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; save_timestamp INTEGER; time_since_last_economy_reset INTEGER NN | id | 2 | 1 | +| economy_outpost_gold | 4 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; outpost_id INTEGER NN; gold_buying_capability_funds INTEGER; gold_selling_capability_funds INTEGER; gold_selling_capability_funds_restock_amount REAL | id | 3 | 2 | +| economy_outposts | 4 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; outpost_runtime_id TEXT; buying_capability REAL; outpost_bank_funds REAL; economy_reset_elapsed_time REAL; prices_randomization_elapsed_time REAL; save_timestamp INTEGER; price_delta_seed REAL; tradeable_rotation_elapsed_time REAL | id | 2 | 1 | +| economy_special_deals | 85 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER NN; sector TEXT NN; tradeable_asset TEXT NN; base_purchase_price INTEGER; amount_in_store INTEGER; override_purchase_ability BOOLEAN; can_be_purchased_by_player BOOLEAN; required_fame_points INTEGER; trader TEXT NN | id | 2 | 1 | +| economy_tradeables_info | 12453 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; trader_id INTEGER NN; tradeable_asset TEXT; amount_in_store INTEGER NN; restock_amount REAL; is_omitted_from_current_rotation BOOLEAN; partial_amount_in_store REAL | id | 3 | 2 | +| economy_traders | 36 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; trader_runtime_id TEXT; available_funds INTEGER | id | 2 | 1 | +| elevated_users | 4 | user_id TEXT PK NN | user_id | 0 | 1 | +| entity | 63379 | id INTEGER PK NN; entity_system_id INTEGER NN; class TEXT NN; owning_entity_id INTEGER; parent_entity_id INTEGER; location_x REAL NN; location_y REAL NN; location_z REAL NN; rotation_x REAL NN; rotation_y REAL NN; rotation_z REAL NN; scale_x REAL NN; scale_y REAL NN; scale_z REAL NN; flags INTEGER NN; data BLOB; reason TEXT | id | 3 | 3 | +| entity_character_inventory_component | 72 | entity_component_id INTEGER NN; last_entity_on_lshoulder INTEGER; last_entity_on_rshoulder INTEGER | - | 3 | 0 | +| entity_component | 62174 | id INTEGER PK NN; entity_id INTEGER NN; name TEXT NN; class TEXT NN; flags INTEGER NN; data BLOB | id | 1 | 1 | +| entity_component_to_delete_on_startup | 0 | entity_component_id INTEGER PK NN | entity_component_id | 1 | 0 | +| entity_decay_manager_entry | 41286 | entity_id INTEGER PK NN; timestamp REAL NN; damage_per_day REAL NN | entity_id | 1 | 0 | +| entity_inventory_component_entry | 2034 | entity_component_id INTEGER PK NN; entity_id INTEGER PK NN; data INTEGER NN | entity_component_id, entity_id | 2 | 2 | +| entity_system | 1 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; timestamp REAL NN | id | 2 | 1 | +| entity_to_delete_on_startup | 6 | entity_id INTEGER PK NN | entity_id | 1 | 0 | +| event | 0 | id INTEGER PK NN | id | 0 | 0 | +| event_participant | 0 | event_id INTEGER PK NN; user_profile_id INTEGER PK NN | event_id, user_profile_id | 2 | 2 | +| event_rankings_cached | 73 | user_id TEXT NN; user_profile_id INTEGER PK NN; name TEXT NN; is_banned INTEGER NN; fame_points REAL NN; score REAL NN; enemy_kills INTEGER NN; team_kills INTEGER NN; deaths INTEGER NN; suicides INTEGER NN; assists INTEGER NN; headshots INTEGER NN; ctf_pickups INTEGER NN; ctf_captures INTEGER NN; ctf_returns INTEGER NN; dm_longest_headshot REAL NN; dm_melee_kills INTEGER NN; dm_longest_life REAL NN; dz_activations INTEGER NN | user_profile_id | 2 | 1 | +| event_round | 0 | id INTEGER PK NN; event_id INTEGER NN; start_time TEXT; end_time TEXT | id | 1 | 1 | +| event_round_stats | 0 | round_id INTEGER PK NN; user_profile_id INTEGER PK NN; score REAL; enemy_kills INTEGER; team_kills INTEGER; deaths INTEGER; suicides INTEGER; assists INTEGER; headshots INTEGER | round_id, user_profile_id | 2 | 2 | +| event_round_stats_ctf | 0 | round_id INTEGER PK NN; user_profile_id INTEGER PK NN; pickups INTEGER; captures INTEGER; returns INTEGER | round_id, user_profile_id | 2 | 2 | +| event_round_stats_dm | 0 | round_id INTEGER PK NN; user_profile_id INTEGER PK NN; longest_headshot REAL; melee_kills INTEGER; longest_life REAL | round_id, user_profile_id | 2 | 2 | +| event_round_stats_dz | 0 | round_id INTEGER PK NN; user_profile_id INTEGER PK NN; activations INTEGER | round_id, user_profile_id | 2 | 2 | +| events_stats | 73 | user_profile_id INTEGER PK NN; events_won INTEGER; events_lost INTEGER; enemy_kills INTEGER; deaths INTEGER; ctf_captures INTEGER; team_kills INTEGER | user_profile_id | 1 | 0 | +| expirable_entity_component | 71 | entity_component_id INTEGER PK NN; start_play_time REAL; duration REAL | entity_component_id | 1 | 0 | +| expirable_vehicle_spawner_info | 0 | map_id INTEGER PK; user_profile_id INTEGER PK; spawner_name TEXT PK; num_spawners_created INTEGER | map_id, user_profile_id, spawner_name | 2 | 1 | +| finished_timed_gift_spawner | 2 | map_id INTEGER PK; user_profile_id INTEGER PK; spawn_time INTEGER PK | map_id, user_profile_id, spawn_time | 2 | 1 | +| fishing_stats | 73 | user_profile_id INTEGER PK NN; fish_caught INTEGER; fish_kept INTEGER; fish_released INTEGER; lines_broken INTEGER; heaviest_fish_caught REAL; longest_fish_caught REAL; bass_caught INTEGER; catfish_caught INTEGER; pike_caught INTEGER; carp_caught INTEGER; amur_caught INTEGER; bleak_caught INTEGER; chub_caught INTEGER; ruffe_caught INTEGER; prussian_carp_caught INTEGER; crucian_carp_caught INTEGER; sardine_caught INTEGER; dentex_caught INTEGER; orata_caught INTEGER; tuna_caught INTEGER | user_profile_id | 1 | 0 | +| food_item_entity | 5693 | entity_id INTEGER PK NN; damage_over_time_outside_refrigerator REAL; is_opened INTEGER | entity_id | 1 | 0 | +| garden | 2 | id INTEGER PK NN; garden_manager_id INTEGER NN; owner_user_profile_id INTEGER; owner_skill_level INTEGER; num_slots_x INTEGER; num_slots_y INTEGER; location_x REAL; location_y REAL; location_z REAL; rotation_r REAL; rotation_p REAL; rotation_y REAL; crafted_age REAL; has_greenhouse BOOL; pest_disease_check_timer REAL; health REAL NN | id | 2 | 2 | +| garden_manager | 1 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; sim_data_sun_irradiance REAL; sim_data_rain_average REAL; sim_data_time_range REAL | id | 2 | 1 | +| garden_manager_height_relative_sim_data | 16 | id INTEGER PK NN; garden_manager_id INTEGER NN; height REAL; temperature REAL; water_evaporation REAL | id | 1 | 1 | +| garden_slot | 110 | id INTEGER PK NN; garden_id INTEGER NN; planter_user_profile_id INTEGER; planter_skill_level INTEGER; slot_position_x INTEGER; slot_position_y INTEGER; species TEXT; stage INTEGER; growth_percentage REAL; water REAL; organic_fertilizer BOOL; industrial_fertilizer BOOL; weed_intenstiy REAL; pesticide_timer REAL; fungicide_timer REAL; weed_repellent_timer REAL; health REAL; dehidration_death_timer REAL; freezing_death_timer REAL; pest_death_timer REAL; disease_death_timer REAL; old_age_death_timer REAL; weed_check_timer REAL; dead BOOL | id | 2 | 2 | +| garden_slot_pest | 330 | id INTEGER PK NN; garden_slot_id INTEGER NN; pest_species TEXT; pest_intensity REAL; disease_species TEXT; disease_intensity REAL | id | 1 | 1 | +| global_aquatic_life_manager | 6 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN | id | 2 | 0 | +| global_aquatic_life_manager_special_volume_types | 6 | id INTEGER PK NN; global_aquatic_life_manager_id INTEGER_NOT_NULL; volume_type TEXT; activation_timestamp REAL | id | 1 | 0 | +| global_aquatic_life_manager_special_volumes | 54 | id INTEGER PK NN; global_aquatic_life_manager_special_volume_type_id INTEGER_NOT_NULL; persistent_id TEXT | id | 1 | 0 | +| global_encounter_manager | 1 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; max_group_id INTEGER | id | 2 | 1 | +| global_encounter_manager_bb_data | 0 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; base_id INTEGER NN; at_least_one_base_member_present_time REAL; encounter_cooldown REAL; base_lifetime REAL | id | 1 | 2 | +| global_encounter_manager_bb_data_flags | 0 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; global_encounter_manager_bb_data_id INTEGER NN; flag_id INTEGER NN | id | 2 | 2 | +| global_encounter_manager_rogue_characters | 0 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; character_class STRING; character_location_x REAL; character_location_y REAL; character_location_z REAL; character_rotation_yaw REAL; character_data BLOB; preset_type TEXT; despawn_lifetime REAL; despawn_lifetime_remaining REAL | id | 1 | 1 | +| global_encounter_manager_visited_points | 0 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; location_x REAL; location_y REAL; location_z REAL; xy_size REAL; z_size REAL; stay_alive_timestamp REAL; remove_time REAL; is_subzone_point BOOLEAN | id | 1 | 1 | +| global_encounter_manager_zone_cooldown | 0 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; zone_location_x REAL; zone_location_y REAL; zone_location_z REAL; sub_zone_index INTEGER; cooldown REAL | id | 1 | 1 | +| global_radiation_data | 1 | map_id INTEGER PK NN; user_profile_id INTEGER PK; timestamp INTEGER NN | map_id, user_profile_id | 2 | 1 | +| gold_price_master_multipliers | 0 | id INTEGER PK NN; date INTEGER; multiplier REAL | id | 0 | 0 | +| heat_source | 4769 | id INTEGER PK NN; map_id INTEGER; user_profile_id INTEGER; location_x REAL; location_y REAL; location_z REAL; temperature REAL; burning_speed REAL; distance_scale REAL; inner_radius REAL; outer_radius REAL; fuel_capacity REAL; temperature_curve_path TEXT; fuel BLOB; uses_fuel_simulation BOOL NN; operating_temperature REAL | id | 2 | 1 | +| ignitable_component_entry | 4 | entity_component_id INTEGER PK NN; was_ever_ignited INTEGER | entity_component_id | 1 | 0 | +| item_container_upgrades | 0 | id INTEGER PK NN; item_container_id INTEGER NN; asset TEXT; num_tries INTEGER | id | 1 | 1 | +| item_containers | 0 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; runtime_id TEXT NN; lock_reset_time INTEGER | id | 2 | 1 | +| item_entity | 62853 | entity_id INTEGER PK NN; health REAL; max_health REAL; radiation_amount REAL; xml TEXT; weight REAL; water_weight REAL; external_weight REAL; total_weight REAL; max_uses INTEGER; flags INTEGER; body_damage_data BLOB | entity_id | 1 | 0 | +| item_entity_spawner | 136794 | id INTEGER PK NN; name TEXT NN; entity_system_id INTEGER NN; evaluation_time REAL NN; num_evaluations INTEGER | id | 1 | 1 | +| item_entity_spawner_cooldown | 17 | item_entity_spawner_id INTEGER PK NN; key INTEGER PK NN; value REAL NN | item_entity_spawner_id, key | 1 | 2 | +| item_entity_spawner_entry | 155893 | item_entity_spawner_id INTEGER PK NN; idx INTEGER PK NN; entity_id INTEGER | item_entity_spawner_id, idx | 2 | 3 | +| item_radiation_exposure_data | 0 | item_id_1 INTEGER PK NN; item_id_2 INTEGER PK NN; map_id INTEGER PK NN; user_profile_id INTEGER PK; radiation_amount REAL NN; pending_radiation_amount REAL NN; modified_timestamp INTEGER NN | item_id_1, item_id_2, map_id, user_profile_id | 2 | 1 | +| item_spawner_evaluation_result_entity_component | 20522 | entity_component_id INTEGER PK NN; usage_ratio REAL NN; health_ratio REAL NN | entity_component_id | 1 | 0 | +| item_spawner_evaluation_result_entity_component_post_spawn_action | 30782 | entity_component_id INTEGER PK NN; idx INTEGER PK NN; action TEXT NN | entity_component_id, idx | 1 | 1 | +| item_spawning_cooldown_groups | 18 | entity_system_id INTEGER NN; idx INTEGER NN; cooldown_min INTEGER NN; cooldown_max INTEGER NN | - | 1 | 1 | +| key_card_item_entity | 4 | entity_id INTEGER PK NN; spawn_reason TEXT | entity_id | 1 | 0 | +| killbox | 12 | name TEXT PK NN; map_id INTEGER PK NN; user_profile_id INTEGER PK; is_active BOOL; is_finale BOOL; remaining_time REAL; rooms_difficulty_packed INTEGER; rooms_state_packed INTEGER | name, map_id, user_profile_id | 2 | 1 | +| local_chat_history | 0 | chat_line TEXT NN | - | 0 | 0 | +| map | 1 | id INTEGER PK NN; name TEXT | id | 0 | 0 | +| muted_users | 0 | user_id_hashed TEXT PK; user_profile_name TEXT | user_id_hashed | 0 | 1 | +| notification | 0 | id INTEGER PK NN; user_profile_id INTEGER NN; data BLOB; timestamp INTEGER | id | 1 | 1 | +| penalty_squad_leave_info | 0 | user_id TEXT PK; squadmates_left INTEGER NN | user_id | 1 | 1 | +| placeable | 16 | id INTEGER PK NN; prisoner_id INTEGER NN; map_id INTEGER NN; asset TEXT; location_x REAL; location_y REAL; location_z REAL; rotation_pitch REAL; rotation_yaw REAL; rotation_roll REAL; placement_location_x REAL; placement_location_y REAL; placement_location_z REAL; process BLOB | id | 2 | 1 | +| placeable_basebuilding | 16 | placeable_id INTEGER NN; first_point_location_x REAL; first_point_location_y REAL; first_point_location_z REAL; state_flags INTEGER; first_point_rotation_pitch REAL; first_point_rotation_yaw REAL; first_point_rotation_roll REAL | - | 1 | 1 | +| placeable_garden | 0 | id INTEGER PK NN; placeable_id INTEGER NN; x_min INTEGER; y_min INTEGER; x_max INTEGER; y_max INTEGER | id | 1 | 1 | +| placeable_upgrade | 0 | placeable_id INTEGER NN; element_base_id INTEGER NN; element_id INTEGER NN; element_location_x REAL; element_location_y REAL; element_location_z REAL | - | 1 | 1 | +| prisoner | 72 | id INTEGER PK NN; user_profile_id INTEGER; is_alive INTEGER; time_of_death TEXT; team_index INTEGER; appearance_index INTEGER; gender INTEGER; head_tattoo_index INTEGER; body_tattoo_index INTEGER; stance INTEGER; melee_target_selection_mode INTEGER; head_water_weight REAL; upper_body_water_weight REAL; lower_body_water_weight REAL; feet_water_weight REAL; penis_size REAL; breast_size INTEGER; time_of_revive TEXT; body_simulation BLOB; should_play_intro_cinematic BOOLEAN; has_open_parachute BOOLEAN; eligible_for_free_plastic_surgery BOOLEAN; last_character_dlcs_owned BOOLEAN; age TINYINT; appearance_hair_style_index TINYINT; appearance_face_type_index TINYINT; appearance_skin_tone_index TINYINT; appearance_hair_color_index TINYINT; appearance_eye_color_index TINYINT; appearance_iris_type_index TINYINT; appearance_eye_makeup_metalness TINYINT; appearance_eye_makeup_intensity TINYINT; appearance_lipstick_roughness TINYINT; appearance_lipstick_intensity TINYINT; appearance_eyeshadow_color_r TINYINT; appearance_eyeshadow_color_g TINYINT; appearance_eyeshadow_color_b TINYINT; appearance_eyeliner_color_r TINYINT; appearance_eyeliner_color_g TINYINT; appearance_eyeliner_color_b TINYINT; appearance_lipstick_color_r TINYINT; appearance_lipstick_color_g TINYINT; appearance_lipstick_color_b TINYINT; awarded_character_dlc_plastic_surgeries BOOLEAN; should_spawn_default_equipment INTEGER; last_save_time INTEGER; is_in_bed BOOLEAN; appearance_moustache_style_index INTEGER; appearance_beard_style_index INTEGER; appearance_facial_hair_color_index INTEGER; appearance_has_body_hair BOOLEAN; appearance_tattoo_indexes BLOB | id | 1 | 2 | +| prisoner_bondage | 0 | prisoner_id INTEGER PK NN; body_part INTEGER PK NN; tightness REAL; item_entity_id INTEGER NN | prisoner_id, body_part | 2 | 2 | +| prisoner_consumed_items | 205 | prisoner_id INTEGER PK NN; item_name TEXT PK NN; last_consumed_time INTEGER; consumed_amount REAL | prisoner_id, item_name | 1 | 1 | +| prisoner_disease_immunities | 26 | prisoner_id INTEGER PK NN; disease_name TEXT PK NN; last_recovered_play_time INTEGER | prisoner_id, disease_name | 1 | 1 | +| prisoner_entity | 72 | entity_id INTEGER PK NN; prisoner_id INTEGER | entity_id | 2 | 1 | +| prisoner_inventory_quick_access_slot | 31 | prisoner_entity_id INTEGER PK NN; slot_index INTEGER PK NN; item_entity_setup TEXT NN; item_entity_id INTEGER; is_in_throwing_mode INTEGER NN | prisoner_entity_id, slot_index | 2 | 2 | +| prisoner_prison_wallet | 17 | prisoner_entity_id INTEGER PK NN; is_deluxe_item_pending INTEGER NN | prisoner_entity_id | 1 | 0 | +| prisoner_respawn_info | 70 | prisoner_id INTEGER PK; penalty_random INTEGER; penalty_sector INTEGER; penalty_shelter INTEGER; penalty_squad INTEGER; last_use_random TEXT; last_use_sector TEXT; last_use_shelter TEXT; last_use_squad TEXT; commit_suicide_penalty INTEGER; commit_suicide_last_use TEXT; commit_suicide_cooldown_left FLOAT | prisoner_id | 1 | 0 | +| prisoner_skill | 1656 | prisoner_id INTEGER NN; name TEXT; level INTEGER; experience REAL; xml TEXT | - | 1 | 1 | +| prisoner_spawn_location | 78 | prisoner_id INTEGER PK NN; map_id INTEGER PK NN; type INTEGER PK NN; shelter_id INTEGER; location_x REAL; location_y REAL; location_z REAL; rotation_pitch REAL; rotation_yaw REAL; rotation_roll REAL; velocity_x REAL; velocity_y REAL; velocity_z REAL | prisoner_id, map_id, type | 3 | 1 | +| prisoner_stats_tracking_info | 1 | prisoner_id INTEGER PK NN; has_ever_maxed_out_core_attributes INTEGER | prisoner_id | 1 | 0 | +| prisoner_vehicle_mountee_info | 0 | prisoner_id INTEGER PK NN; vehicle_entity_id INTEGER PK NN; mount_slot_index INTEGER | prisoner_id, vehicle_entity_id | 2 | 2 | +| probation_squad_leave_info | 0 | user_id TEXT PK; start_timestamp INTEGER NN; squadmates_left INTEGER NN | user_id | 1 | 1 | +| quest_cycle_stats | 0 | id INTEGER PK NN; user_profile_id INTEGER NN; map_id INTEGER NN; associated_npc TEXT; sector TEXT; num_completed_quests INTEGER NN | id | 2 | 1 | +| quest_in_pool | 0 | id INTEGER PK NN; quest_pool_id INTEGER NN; quest_mapping_key TEXT NN; sector TEXT; rewards_index INTEGER NN; random_seed INTEGER NN | id | 1 | 1 | +| quest_lifetime_stats | 63 | id INTEGER PK NN; user_profile_id INTEGER NN; map_id INTEGER NN; associated_npc TEXT; tier INTEGER NN; sector TEXT NN; total_num_completed_quests INTEGER NN | id | 2 | 1 | +| quest_pool | 0 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; quest_giver_hash INTEGER NN; quest_giver_bound_user_id INTEGER; quest_giver_type TEXT NN | id | 2 | 2 | +| quest_refresh | 1 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; next_reset_timestamp REAL NN | id | 2 | 1 | +| quest_unlocked_tag | 30 | id INTEGER PK NN; user_profile_id INTEGER NN; map_id INTEGER NN; tag TEXT NN | id | 2 | 1 | +| rain_collector | 5637 | id INTEGER PK NN; map_id INTEGER PK NN; user_profile_id INTEGER PK; amount REAL; fill_rate REAL; max_amount REAL | id, map_id, user_profile_id | 2 | 1 | +| remote_sensor_registry_key_codes_to_unpair | 1 | map_id INTEGER NN; user_profile_id INTEGER; key_code TEXT NN | - | 2 | 1 | +| replenishable_resource | 584 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; desc BLOB; amount REAL; timer REAL; save_time INTEGER | id | 2 | 1 | +| restorable_mesh_instance | 0 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; component_name TEXT; packed_location INTEGER; location_x REAL; location_y REAL; location_z REAL; rotation_x REAL; rotation_y REAL; rotation_z REAL; rotation_w REAL; scale_x REAL; scale_y REAL; scale_z REAL; restore_interval REAL; restore_timer REAL; save_time INTEGER | id | 2 | 1 | +| sentries | 0 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER; sentry_location_x REAL; sentry_location_y REAL; sentry_location_z REAL; sentry_rotation_yaw REAL; sentry_health REAL; sentry_longrangeweapon_ammo INTEGER | id | 2 | 1 | +| sentry_ai_controllers | 0 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER; sentry_id INTEGER; sentry_state INTEGER; player_last_known_location_x REAL; player_last_known_location_y REAL; player_last_known_location_z REAL; player_last_known_direction_x REAL; player_last_known_direction_y REAL; player_last_known_direction_z REAL; player_threat_level REAL; player_has_entered_hot_zone BOOL | id | 3 | 2 | +| sentry_spawners | 0 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER; spawner_location_x REAL; spawner_location_y REAL; spawner_location_z REAL; sentry_id INTEGER | id | 3 | 2 | +| server_settings | 1 | enable_item_cooldown_groups INTEGER NN; is_radiation_enabled INTEGER | - | 0 | 0 | +| shelter | 817 | id INTEGER PK NN | id | 0 | 0 | +| shown_dialogues | 0 | map_id INTEGER PK NN; user_profile_id INTEGER PK; dialogue_name TEXT PK NN | map_id, user_profile_id, dialogue_name | 2 | 1 | +| shown_survival_tips | 0 | map_id INTEGER PK NN; user_profile_id INTEGER PK; survival_tip_name TEXT PK NN; seen_in_codex BOOLEAN | map_id, user_profile_id, survival_tip_name | 2 | 1 | +| spawned_item_expiration_data | 23 | id INTEGER PK NN; map_id INTEGER NN; user_profile_id INTEGER; examiner_user_id TEXT NN; item_asset TEXT NN; item_expiration_timestamp INTEGER NN | id | 3 | 2 | +| squad | 7 | id INTEGER PK NN; name TEXT; message TEXT; emblem INTEGER; information TEXT; score REAL; member_limit INTEGER; last_member_login_time TEXT; last_member_logout_time TEXT | id | 0 | 1 | +| squad_member | 18 | id INTEGER PK NN; squad_id INTEGER NN; user_profile_id INTEGER NN; rank INTEGER | id | 2 | 2 | +| stackable_component_entry | 5120 | entity_component_id INTEGER PK NN; foreign_classes_blob BLOB | entity_component_id | 1 | 0 | +| survival_stats | 73 | user_profile_id INTEGER PK NN; highest_positive_fame_points REAL; doors_claimed INTEGER; animals_killed INTEGER; minutes_survived REAL; kills INTEGER; deaths INTEGER; locks_picked INTEGER; puppets_killed INTEGER; guns_crafted INTEGER; bullets_crafted INTEGER; arrows_crafted INTEGER; clothing_crafted INTEGER; longest_kill_distance REAL; melee_kills INTEGER; archery_kills INTEGER; players_knocked_out INTEGER; total_defecations INTEGER; total_urinations INTEGER; lights_fired INTEGER; containers_looted INTEGER; items_put_into_containers INTEGER; deaths_by_prisoners INTEGER; animals_skinned INTEGER; food_eaten REAL; distance_travelled_by_foot REAL; wounds_patched INTEGER; items_picked_up INTEGER; liquid_drank REAL; teeth_lost INTEGER; total_calories_intake INTEGER; shots_fired INTEGER; shots_hit INTEGER; headshots INTEGER; melee_weapon_swings INTEGER; melee_weapon_hits INTEGER; melee_weapons_crafted INTEGER; drone_kills INTEGER; sentry_kills INTEGER; prisoner_kills INTEGER; puppets_knocked_out INTEGER; diarrheas INTEGER; vomits INTEGER; distance_travelled_in_vehicle REAL; mushrooms_eaten INTEGER; highest_muscle_mass REAL; highest_fat REAL; heart_attacks INTEGER; overdose INTEGER; starvation INTEGER; highest_damage_taken REAL; highest_weight_carried REAL; lowest_negative_fame_points REAL; distance_travelled_swimming REAL; crows_killed INTEGER; seagulls_killed INTEGER; horses_killed INTEGER; boars_killed INTEGER; bears_killed INTEGER; goats_killed INTEGER; deers_killed INTEGER; chickens_killed INTEGER; rabbits_killed INTEGER; donkeys_killed INTEGER; times_mauled_by_bear INTEGER; longest_animal_kill_distance REAL; alcohol_drank INTEGER NN; foliage_cut INTEGER NN; distance_travel_by_boat REAL NN; distance_sailed REAL NN; times_caught_by_shark INTEGER NN; times_escaped_shark_bite INTEGER NN; wolves_killed INTEGER; last_fame_point_award_consecutive_days INTEGER; firearm_kills INTEGER; bare_handed_kills INTEGER | user_profile_id | 1 | 0 | +| tracked_quest | 37 | id INTEGER PK NN; user_profile_id INTEGER NN; map_id INTEGER NN; quest_id INTEGER NN; type INTEGER NN | id | 3 | 2 | +| tracking_data | 194 | id INTEGER PK NN; tracking_data_set_id INTEGER NN; data BLOB; version INTEGER; random_seed INTEGER NN | id | 1 | 1 | +| tracking_data_set | 38 | id INTEGER PK NN; user_profile_id INTEGER; map_id INTEGER NN; sequence_index INTEGER | id | 2 | 1 | +| user | 74 | id TEXT PK NN; name TEXT; provider TEXT; last_login_time TEXT; last_direct_connection_address TEXT; is_banned INTEGER; has_used_new_player_protection BOOLEAN; creation_time TEXT; id_type TEXT | id | 0 | 1 | +| user_accepted_policies | 0 | user_id TEXT PK NN; policy_id TEXT PK NN; accepted_version INTEGER NN | user_id, policy_id | 1 | 1 | +| user_favorite_server | 0 | user_id TEXT NN; name TEXT; host TEXT; port INTEGER | - | 1 | 1 | +| user_profile | 73 | id INTEGER PK NN; user_id TEXT; template_xml TEXT; name TEXT; type INTEGER; authority_name TEXT; authority_ip TEXT; authority_response_port INTEGER; authority_gameplay_port INTEGER; authority_user_profile_id INTEGER; authority_auth_token TEXT; last_login_time TEXT; prisoner_id INTEGER; fame_points REAL; fake_name TEXT; last_logout_time TEXT; money_balance INTEGER; global_spam_protection_state BLOB; local_spam_protection_state BLOB; last_name_change TEXT; favorite_crafting_recipes BLOB; deluxe_version BLOB; play_time INTEGER; has_used_new_player_protection BOOLEAN; creation_time TEXT | id | 2 | 3 | +| user_profiles_marked_for_deletion | 0 | id INTEGER PK NN; user_id INTEGER NN; user_profile_id INTEGER NN | id | 2 | 3 | +| user_recent_server | 0 | user_id TEXT NN; name TEXT; host TEXT; port INTEGER | - | 1 | 1 | +| vehicle_entity | 313 | entity_id INTEGER PK NN; item_container_entity_id INTEGER; data BLOB | entity_id | 2 | 1 | +| vehicle_service | 0 | map_id INTEGER PK NN; user_profile_id INTEGER PK; vehicle_id INTEGER PK NN; initiator_id INTEGER; service_station_data BLOB | map_id, user_profile_id, vehicle_id | 3 | 2 | +| vehicle_spawner | 313 | vehicle_entity_id INTEGER PK NN; vehicle_asset_id TEXT NN; vehicle_alias TEXT NN; vehicle_last_access_time INTEGER NN; is_vehicle_automatically_created BOOL NN; time_spent_in_forbidden_zone REAL NN; is_vehicle_functional BOOL NN | vehicle_entity_id | 1 | 0 | +| virtualized_encounters | 318 | id INTEGER PK NN; global_encounter_manager_id INTEGER NN; virutalized_encounter_data BLOB; reset_time REAL | id | 1 | 1 | +| virtualized_item | 3943 | item_entity_id INTEGER PK; expiration_time INTEGER; item_name TEXT; can_expire INTEGER; save_time INTEGER; bounds_size REAL; queued_visit_time INTEGER; item_user_data BLOB; owner_user_profile_id INTEGER | item_entity_id | 2 | 1 | +| weapon_attachment_item_entity | 1212 | entity_id INTEGER PK NN | entity_id | 1 | 0 | +| weapon_attachment_magazine_item_entity | 1060 | entity_id INTEGER PK NN | entity_id | 1 | 0 | +| weapon_attachment_magazine_item_entity_ammo_data | 1613 | weapon_attachment_magazine_item_entity_id INTEGER PK NN; ammunition_data_id INTEGER PK NN | weapon_attachment_magazine_item_entity_id, ammunition_data_id | 2 | 2 | +| weapon_item_entity | 432 | entity_id INTEGER PK NN | entity_id | 1 | 0 | +| weapon_item_entity_internal_magazine_ammo_data | 34 | weapon_item_entity_id INTEGER PK NN; ammunition_data_id INTEGER PK NN | weapon_item_entity_id, ammunition_data_id | 2 | 2 | +| weapon_item_entity_loaded_ammo_data | 26 | weapon_item_entity_id INTEGER PK NN; ammunition_data_id INTEGER PK NN | weapon_item_entity_id, ammunition_data_id | 2 | 2 | +| weather_parameters | 1 | map_id INTEGER PK NN; user_profile_id INTEGER PK; time_of_day REAL; moon_rotation REAL; base_air_temperature REAL; water_temperature REAL; should_cumulonimbus_cause_fog INTEGER; fog_density REAL; data BLOB | map_id, user_profile_id | 2 | 1 | diff --git a/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-log-structure-baseline-2026-08-13.md b/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-log-structure-baseline-2026-08-13.md new file mode 100644 index 0000000..6f71f5e --- /dev/null +++ b/openspec/changes/replace-scum-projections-with-real-data-management/evidence/scum-current-service-log-structure-baseline-2026-08-13.md @@ -0,0 +1,68 @@ +# SCUM current-service log structure baseline (redacted) + +- diagnostic: scum-current-service-log-structure-v4 +- observed_utc: 2026-08-13T03:24:34Z +- root_strategy: running-process-adjacent plus common profile roots +- roots_scanned: 9 +- log_file_count: 1200 +- redaction: no host paths, raw log lines, credentials, sockets, IPs, or player identities + +## Directory fingerprints + +| directory_sha256 | files | bytes | oldest_mtime | newest_mtime | filename_patterns | +|---|---:|---:|---|---|---| +| 8f7b4724b579a891c9208f9a67116925f66b4c4ed9de67024a76bc846ecbfad2 | 1136 | 23425208 | 2026-03-27T19:37:41Z | 2026-08-13T03:19:26Z | admin_{digits}.log x60; armor_absorption_{digits}.log x60; base_building_destruction_{digits}.log x60; chat_{digits}.log x60; chest_ownership_{digits}.log x60; economy_{digits}.log x60; event_kill_{digits}.log x60; famepoints_{digits}.log x60; gameplay_{digits}.log x60; kill_{digits}.log x60; login_{digits}.log x60; loot_{digits}.log x60; quests_{digits}.log x60; raid_protection_{digits}.log x60; sentry_{digits}.log x60; server_notifications_{digits}.log x60 | +| 3f15fc215272bffbd13ec0381693a72c88bd2506542387b441ea5f26c9537d29 | 52 | 7002932 | 2025-08-27T04:07:52Z | 2026-08-13T00:18:24Z | connection_log_{n}.txt x16; connection_log_{n}.previous.txt x8; configstore_log.txt x4; connection_log.previous.txt x4; connection_log.txt x4; service_log.txt x4; stats_log.previous.txt x4; stats_log.txt x4; systemmanager.txt x4 | +| 03976d194b46bbb5ec3e755c9d73dd4e3240ea209ebccf7f6d399281e590f867 | 6 | 13660622 | 2026-03-24T03:31:36Z | 2026-08-13T03:24:33Z | SCUM_{n}.log x4; SCUM.log x2 | +| 74e7a2b6564768eab96dafeb19297a6b0c8400eeeff30fc88c5a03162898b5db | 4 | 24 | 2025-07-29T16:16:59Z | 2025-07-29T16:16:59Z | steam_appid.txt x4 | +| 152191e5251dd1d77824d1ffe4726eca62e2a647205c36cf4ea153bb0b6b4e90 | 2 | 35815054 | 2025-11-21T21:37:44Z | 2025-11-21T21:37:44Z | SCUM.log x2 | + +## Filename pattern inventory + +| filename_pattern | files | bytes | oldest_mtime | newest_mtime | encodings_seen | +|---|---:|---:|---|---|---| +| SCUM.log | 4 | 48218920 | 2025-11-21T21:37:44Z | 2026-08-13T03:24:33Z | utf-8-sig x4 | +| SCUM_{n}.log | 4 | 1256756 | 2026-03-24T03:31:36Z | 2026-05-29T11:51:50Z | utf-8-sig x4 | +| admin_{digits}.log | 60 | 87840 | 2026-03-27T19:37:41Z | 2026-08-12T23:56:42Z | unknown x60 | +| armor_absorption_{digits}.log | 60 | 6000 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| base_building_destruction_{digits}.log | 60 | 19264 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| chat_{digits}.log | 60 | 215608 | 2026-04-02T21:46:35Z | 2026-08-12T23:45:22Z | unknown x60 | +| chest_ownership_{digits}.log | 60 | 179952 | 2026-03-27T20:59:30Z | 2026-08-12T01:18:15Z | unknown x60 | +| configstore_log.txt | 4 | 699044 | 2026-08-13T00:18:01Z | 2026-08-13T00:18:01Z | unknown x4 | +| connection_log.previous.txt | 4 | 1048280 | 2026-06-15T07:06:40Z | 2026-06-15T07:06:40Z | unknown x4 | +| connection_log.txt | 4 | 66156 | 2026-08-12T01:18:13Z | 2026-08-12T01:18:13Z | unknown x4 | +| connection_log_{n}.previous.txt | 8 | 2096872 | 2025-08-27T04:07:52Z | 2026-06-23T22:09:49Z | unknown x8 | +| connection_log_{n}.txt | 16 | 1189424 | 2026-05-27T00:15:29Z | 2026-08-13T00:18:24Z | unknown x16 | +| economy_{digits}.log | 60 | 11669828 | 2026-03-29T20:22:15Z | 2026-08-12T01:18:15Z | unknown x60 | +| event_kill_{digits}.log | 60 | 6000 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| famepoints_{digits}.log | 60 | 311680 | 2026-04-03T02:00:13Z | 2026-08-12T01:18:15Z | unknown x60 | +| gameplay_{digits}.log | 60 | 4727592 | 2026-04-06T17:39:14Z | 2026-08-13T03:19:26Z | unknown x60 | +| kill_{digits}.log | 60 | 321132 | 2026-04-05T02:33:31Z | 2026-08-12T01:18:15Z | unknown x60 | +| login_{digits}.log | 60 | 528916 | 2026-04-05T02:33:44Z | 2026-08-12T23:43:03Z | unknown x60 | +| loot_{digits}.log | 60 | 1519888 | 2026-03-27T19:37:51Z | 2026-08-12T01:18:23Z | unknown x60 | +| network_objects_{digits}.log | 56 | 5600 | 2026-05-06T02:24:44Z | 2026-08-12T01:18:15Z | unknown x56 | +| quests_{digits}.log | 60 | 50320 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| raid_protection_{digits}.log | 60 | 13600 | 2026-03-27T19:37:52Z | 2026-08-12T01:18:24Z | unknown x60 | +| sentry_{digits}.log | 60 | 6000 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| server_notifications_{digits}.log | 60 | 6000 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | +| service_log.txt | 4 | 145156 | 2026-08-12T01:18:13Z | 2026-08-12T01:18:13Z | unknown x4 | +| stats_log.previous.txt | 4 | 1048448 | 2026-05-08T00:23:23Z | 2026-05-08T00:23:23Z | unknown x4 | +| stats_log.txt | 4 | 615312 | 2026-08-12T23:43:24Z | 2026-08-12T23:43:24Z | unknown x4 | +| steam_appid.txt | 4 | 24 | 2025-07-29T16:16:59Z | 2025-07-29T16:16:59Z | unknown x4 | +| systemmanager.txt | 4 | 94240 | 2026-08-12T01:18:13Z | 2026-08-12T01:18:13Z | unknown x4 | +| vehicle_destruction_{digits}.log | 60 | 3446040 | 2026-04-05T02:21:34Z | 2026-08-12T01:18:24Z | unknown x60 | +| violations_{digits}.log | 60 | 303948 | 2026-03-27T19:37:41Z | 2026-08-12T01:18:15Z | unknown x60 | + +## Representative sanitized line-shape observations + +The first line-shape diagnostic successfully discovered the same process-adjacent log set and emitted redacted ASCII skeletons before Windows stdout encoding aborted the tail of that diagnostic. The authoritative file inventory above comes from the successful v4 diagnostic. The v2 prefix showed these structural properties without raw lines: + +- `login_{digits}.log`, `admin_{digits}.log`, `gameplay_{digits}.log`, `loot_{digits}.log`, and related SCUM event logs are readable as text samples and include date-like prefixes. +- `gameplay_{digits}.log`, `vehicle_destruction_{digits}.log`, and login fixtures carry coordinate-shaped `X=/Y=/Z=` tokens in some lines. +- Several operational logs contain network-shaped tokens; parsers must strip or avoid network material before durable storage and logical fingerprints. +- `connection_log*.txt`, `service_log.txt`, `stats_log.txt`, and `systemmanager.txt` are separate service/runtime log families and must not be conflated with SCUM gameplay event files. + +## Read-safety notes + +- Diagnostic only grouped file metadata and BOM fingerprints; no raw log line was emitted in the committed inventory. +- Existing `scum-login-log-fixtures-2026-08-13.md` remains the source for redacted parser fixtures; this baseline records broader log inventory and structure. diff --git a/openspec/changes/replace-scum-projections-with-real-data-management/tasks.md b/openspec/changes/replace-scum-projections-with-real-data-management/tasks.md index b417be0..cec9524 100644 --- a/openspec/changes/replace-scum-projections-with-real-data-management/tasks.md +++ b/openspec/changes/replace-scum-projections-with-real-data-management/tasks.md @@ -70,6 +70,13 @@ - Added manifest tests proving production omits unverified typed RCON templates and gift catalogs, and rejects any SCUM typed RCON declaration without a conclusive confirmation schema. - Verification passed: `(cd plugins && npm test -- manifest-validation.test.ts)`. +### Current-service baseline refresh (2026-08-13) + +- Per operator correction, the change now stores current-service structure baselines before attempting further capability declarations. `evidence/scum-current-service-db-schema-baseline-2026-08-13.md` records the full `161`-table compact schema inventory from a server-local read-only Python diagnostic, including row counts, columns, primary-key columns, foreign-key counts, and index counts without raw rows, SQL, XML, paths, credentials, sockets, IPs, or player identities. +- `evidence/scum-current-service-log-structure-baseline-2026-08-13.md` records the process-adjacent log inventory from a successful server-local diagnostic: `1200` log/text files across hashed directories, including `login_{digits}.log`, `admin_{digits}.log`, `gameplay_{digits}.log`, `economy_{digits}.log`, `chat_{digits}.log`, `vehicle_destruction_{digits}.log`, `SCUM.log`, and service/runtime log families. Raw log lines and paths were not emitted or stored. +- A broader line-shape diagnostic confirmed coordinate-shaped and network-shaped tokens exist in multiple log families, so parser assets must stay per-file-pattern and strip network material before durable storage. The authoritative file inventory remains the successful v4 evidence file. +- Task 3.10 remains unchecked: the refreshed schema baseline confirms `user_profile.template_xml`, `prisoner_skill.xml`, and `item_entity.xml` as XML-bearing sources, but it still does not prove named attribute mappings, preserving patch semantics, offline/backup/readback requirements, or an operator-confirmed `855` preset. + - [x] 3.1 Add SDK and manifest types for versioned log parsers, SQLite query assets, parameter/result schemas, capability-specific schema fingerprints, sync cadence/limits, map metadata, typed RCON templates, gift item catalogs, and guarded mutation declarations. - [x] 3.2 Extend plugin validation to require asset digests, contained package paths, unique template keys, bounded parameters/results, compatible adapter versions, and explicit permission bindings, and to reject raw caller-supplied SQL, RCON, XML, paths, or undeclared parameters. - [x] 3.3 Capture sanitized authentic login-log fixtures from the active service and bind their expected events to server, Run binding, plugin version, parser version/digest, a transport cursor `(source identity, stream generation, sequence)`, and a separate privacy-safe logical event identity stable across rotation overlap.