Probe raw save investor-confidence issue state
This commit is contained in:
parent
a1ace18a0d
commit
934b0049eb
5 changed files with 174 additions and 15 deletions
15
README.md
15
README.md
|
|
@ -30,8 +30,9 @@ documents can now also carry explicit company rosters and chairman-profile table
|
||||||
company-targeted and chairman-targeted descriptor and condition batches can execute from standalone
|
company-targeted and chairman-targeted descriptor and condition batches can execute from standalone
|
||||||
save-slice fixtures without overlay snapshots when that context is present; raw `.gms` inspection
|
save-slice fixtures without overlay snapshots when that context is present; raw `.gms` inspection
|
||||||
now reconstructs both collections automatically: the fixed save-side `0x32c8` world block still
|
now reconstructs both collections automatically: the fixed save-side `0x32c8` world block still
|
||||||
supplies selected company/chairman ids plus the campaign override byte and chairman slot/role-gate
|
supplies selected company/chairman ids plus the campaign override byte, the grounded issue-`0x37`
|
||||||
analysis bytes, and the tagged company / chairman-profile direct-record families now populate
|
value/multiplier pair, and chairman slot/role-gate analysis bytes, and the tagged company /
|
||||||
|
chairman-profile direct-record families now populate
|
||||||
save-native roster entries for real `.gms` imports and exports. The current raw-save boundary is
|
save-native roster entries for real `.gms` imports and exports. The current raw-save boundary is
|
||||||
narrower now: company/chairman identity, active flags, links, chairman cash, chairman holdings,
|
narrower now: company/chairman identity, active flags, links, chairman cash, chairman holdings,
|
||||||
chairman purchasing power, company debt, and company track-laying capacity are grounded directly
|
chairman purchasing power, company debt, and company track-laying capacity are grounded directly
|
||||||
|
|
@ -42,9 +43,13 @@ surface also now exposes `runtime inspect-save-company-chairman <save.gms>` for
|
||||||
company/chairman scalar candidates, including fixed-world chairman slot / role-gate context,
|
company/chairman scalar candidates, including fixed-world chairman slot / role-gate context,
|
||||||
explicit company dword candidate windows, richer chairman qword cache views, and derived
|
explicit company dword candidate windows, richer chairman qword cache views, and derived
|
||||||
holdings-at-share-price / cached purchasing-power comparisons. The same fixed `0x32c8` world
|
holdings-at-share-price / cached purchasing-power comparisons. The same fixed `0x32c8` world
|
||||||
block is now probed for its six-float economic tuning band too, but current atlas evidence still
|
block is now probed for both the grounded issue-`0x37` pair at `[world+0x29/+0x2d]` and the
|
||||||
keeps that editor-facing tuning family separate from the governance issue lanes behind investor
|
separate six-float economic tuning band, but current atlas evidence still keeps that editor-facing
|
||||||
confidence and prime-rate math. A checked-in
|
tuning family distinct from the governance issue lanes behind investor confidence and prime-rate
|
||||||
|
math. A checked-in
|
||||||
|
The working rule on the remaining frontier is explicit now too: when a lane is still ambiguous, we
|
||||||
|
should prefer rehosting the owning source state or the real reader/setter family rather than
|
||||||
|
guessing one more derived leaf field from nearby offsets. A checked-in
|
||||||
`EventEffects` export now exists too in
|
`EventEffects` export now exists too in
|
||||||
`artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer now
|
`artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer now
|
||||||
exists beside it in `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json`. Recovered
|
exists beside it in `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json`. Recovered
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ pub use smp::{
|
||||||
SmpSaveChairmanRecordAnalysisEntry, SmpSaveCompanyChairmanAnalysisReport,
|
SmpSaveChairmanRecordAnalysisEntry, SmpSaveCompanyChairmanAnalysisReport,
|
||||||
SmpSaveCompanyRecordAnalysisEntry, SmpSaveDwordCandidate, SmpSaveLoadCandidateTableSummary,
|
SmpSaveCompanyRecordAnalysisEntry, SmpSaveDwordCandidate, SmpSaveLoadCandidateTableSummary,
|
||||||
SmpSaveLoadSummary, SmpSaveScalarCandidate, SmpSaveTaggedCollectionHeaderProbe,
|
SmpSaveLoadSummary, SmpSaveScalarCandidate, SmpSaveTaggedCollectionHeaderProbe,
|
||||||
SmpSaveWorldEconomicTuningProbe, SmpSaveWorldSelectionRoleAnalysis,
|
SmpSaveWorldEconomicTuningProbe, SmpSaveWorldIssue37Probe, SmpSaveWorldSelectionRoleAnalysis,
|
||||||
SmpSaveWorldSelectionRoleAnalysisEntry, SmpSecondaryVariantProbe, SmpSharedHeader,
|
SmpSaveWorldSelectionRoleAnalysisEntry, SmpSecondaryVariantProbe, SmpSharedHeader,
|
||||||
SmpSpecialConditionEntry, SmpSpecialConditionsProbe,
|
SmpSpecialConditionEntry, SmpSpecialConditionsProbe,
|
||||||
inspect_save_company_and_chairman_analysis_bytes,
|
inspect_save_company_and_chairman_analysis_bytes,
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,8 @@ const RT3_SAVE_WORLD_BLOCK_NEXT_CHUNK_TAG: u32 = 0x000032c9;
|
||||||
const RT3_SAVE_WORLD_BLOCK_LEN: usize = 0x4f2c;
|
const RT3_SAVE_WORLD_BLOCK_LEN: usize = 0x4f2c;
|
||||||
const RT3_SAVE_WORLD_BLOCK_SELECTED_COMPANY_ID_RELATIVE_OFFSET: usize = 0x1d;
|
const RT3_SAVE_WORLD_BLOCK_SELECTED_COMPANY_ID_RELATIVE_OFFSET: usize = 0x1d;
|
||||||
const RT3_SAVE_WORLD_BLOCK_SELECTED_CHAIRMAN_PROFILE_ID_RELATIVE_OFFSET: usize = 0x21;
|
const RT3_SAVE_WORLD_BLOCK_SELECTED_CHAIRMAN_PROFILE_ID_RELATIVE_OFFSET: usize = 0x21;
|
||||||
|
const RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_MULTIPLIER_RELATIVE_OFFSET: usize = 0x25;
|
||||||
|
const RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_VALUE_RELATIVE_OFFSET: usize = 0x29;
|
||||||
const RT3_SAVE_WORLD_BLOCK_CHAIRMAN_SLOT_SELECTOR_RELATIVE_OFFSET: usize = 0x83;
|
const RT3_SAVE_WORLD_BLOCK_CHAIRMAN_SLOT_SELECTOR_RELATIVE_OFFSET: usize = 0x83;
|
||||||
const RT3_SAVE_WORLD_BLOCK_CAMPAIGN_OVERRIDE_FLAG_RELATIVE_OFFSET: usize = 0xc1;
|
const RT3_SAVE_WORLD_BLOCK_CAMPAIGN_OVERRIDE_FLAG_RELATIVE_OFFSET: usize = 0xc1;
|
||||||
const RT3_SAVE_WORLD_BLOCK_CHAIRMAN_ROLE_GATE_RELATIVE_OFFSET: usize = 0x0bbf;
|
const RT3_SAVE_WORLD_BLOCK_CHAIRMAN_ROLE_GATE_RELATIVE_OFFSET: usize = 0x0bbf;
|
||||||
|
|
@ -1496,6 +1498,20 @@ pub struct SmpSaveWorldEconomicTuningProbe {
|
||||||
pub evidence: Vec<String>,
|
pub evidence: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct SmpSaveWorldIssue37Probe {
|
||||||
|
pub profile_family: String,
|
||||||
|
pub source_kind: String,
|
||||||
|
pub semantic_family: String,
|
||||||
|
pub chunk_tag_offset: usize,
|
||||||
|
pub payload_offset: usize,
|
||||||
|
pub payload_len: usize,
|
||||||
|
pub payload_len_hex: String,
|
||||||
|
pub issue_value_lane: SmpSaveDwordCandidate,
|
||||||
|
pub multiplier_lane: SmpSaveDwordCandidate,
|
||||||
|
pub evidence: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||||
pub struct SmpSaveTaggedCollectionHeaderProbe {
|
pub struct SmpSaveTaggedCollectionHeaderProbe {
|
||||||
pub profile_family: String,
|
pub profile_family: String,
|
||||||
|
|
@ -2296,6 +2312,8 @@ pub struct SmpSaveCompanyChairmanAnalysisReport {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub world_selection_context: Option<SmpSaveWorldSelectionRoleAnalysis>,
|
pub world_selection_context: Option<SmpSaveWorldSelectionRoleAnalysis>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
pub world_issue_37: Option<SmpSaveWorldIssue37Probe>,
|
||||||
|
#[serde(default)]
|
||||||
pub world_economic_tuning: Option<SmpSaveWorldEconomicTuningProbe>,
|
pub world_economic_tuning: Option<SmpSaveWorldEconomicTuningProbe>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub company_entries: Vec<SmpSaveCompanyRecordAnalysisEntry>,
|
pub company_entries: Vec<SmpSaveCompanyRecordAnalysisEntry>,
|
||||||
|
|
@ -2543,6 +2561,7 @@ pub struct SmpInspectionReport {
|
||||||
pub rt3_105_post_span_bridge_probe: Option<SmpRt3105PostSpanBridgeProbe>,
|
pub rt3_105_post_span_bridge_probe: Option<SmpRt3105PostSpanBridgeProbe>,
|
||||||
pub rt3_105_save_bridge_payload_probe: Option<SmpRt3105SaveBridgePayloadProbe>,
|
pub rt3_105_save_bridge_payload_probe: Option<SmpRt3105SaveBridgePayloadProbe>,
|
||||||
pub save_world_selection_context_probe: Option<SmpSaveWorldSelectionContextProbe>,
|
pub save_world_selection_context_probe: Option<SmpSaveWorldSelectionContextProbe>,
|
||||||
|
pub save_world_issue_37_probe: Option<SmpSaveWorldIssue37Probe>,
|
||||||
pub save_world_economic_tuning_probe: Option<SmpSaveWorldEconomicTuningProbe>,
|
pub save_world_economic_tuning_probe: Option<SmpSaveWorldEconomicTuningProbe>,
|
||||||
pub save_company_collection_header_probe: Option<SmpSaveTaggedCollectionHeaderProbe>,
|
pub save_company_collection_header_probe: Option<SmpSaveTaggedCollectionHeaderProbe>,
|
||||||
pub save_chairman_profile_collection_header_probe: Option<SmpSaveTaggedCollectionHeaderProbe>,
|
pub save_chairman_profile_collection_header_probe: Option<SmpSaveTaggedCollectionHeaderProbe>,
|
||||||
|
|
@ -2750,6 +2769,15 @@ pub fn load_save_slice_from_report(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let Some(probe) = &report.save_world_issue_37_probe {
|
||||||
|
notes.push(format!(
|
||||||
|
"Raw save fixed world block also exposes the grounded issue-0x37 pair: value={} at file offset 0x{:x} and companion multiplier {:.6} at file offset 0x{:x}.",
|
||||||
|
probe.issue_value_lane.value_i32,
|
||||||
|
probe.payload_offset + probe.issue_value_lane.relative_offset,
|
||||||
|
probe.multiplier_lane.value_f32,
|
||||||
|
probe.payload_offset + probe.multiplier_lane.relative_offset
|
||||||
|
));
|
||||||
|
}
|
||||||
if let Some(probe) = &report.save_world_economic_tuning_probe {
|
if let Some(probe) = &report.save_world_economic_tuning_probe {
|
||||||
notes.push(format!(
|
notes.push(format!(
|
||||||
"Raw save fixed world block also exposes the six-lane economic tuning float band at file offset 0x{:x} (mirror lane at 0x{:x}).",
|
"Raw save fixed world block also exposes the six-lane economic tuning float band at file offset 0x{:x} (mirror lane at 0x{:x}).",
|
||||||
|
|
@ -2837,6 +2865,7 @@ pub fn inspect_save_company_and_chairman_analysis_bytes(
|
||||||
) -> Option<SmpSaveCompanyChairmanAnalysisReport> {
|
) -> Option<SmpSaveCompanyChairmanAnalysisReport> {
|
||||||
let selection_probe = report.save_world_selection_context_probe.as_ref();
|
let selection_probe = report.save_world_selection_context_probe.as_ref();
|
||||||
let world_selection_context = selection_probe.map(build_save_world_selection_role_analysis);
|
let world_selection_context = selection_probe.map(build_save_world_selection_role_analysis);
|
||||||
|
let world_issue_37 = report.save_world_issue_37_probe.clone();
|
||||||
let world_economic_tuning = report.save_world_economic_tuning_probe.clone();
|
let world_economic_tuning = report.save_world_economic_tuning_probe.clone();
|
||||||
let company_header_probe = report.save_company_collection_header_probe.as_ref();
|
let company_header_probe = report.save_company_collection_header_probe.as_ref();
|
||||||
let chairman_header_probe = report
|
let chairman_header_probe = report
|
||||||
|
|
@ -3048,6 +3077,12 @@ pub fn inspect_save_company_and_chairman_analysis_bytes(
|
||||||
.to_string(),
|
.to_string(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
if world_issue_37.is_some() {
|
||||||
|
notes.push(
|
||||||
|
"World analysis now also exports the grounded issue-0x37 pair from the same 0x32c8 world payload: the clamped small issue value at [world+0x2d] and its companion multiplier lane at [world+0x29]."
|
||||||
|
.to_string(),
|
||||||
|
);
|
||||||
|
}
|
||||||
if world_economic_tuning.is_some() {
|
if world_economic_tuning.is_some() {
|
||||||
notes.push(
|
notes.push(
|
||||||
"World analysis now also exports the fixed six-lane economic tuning float block from the same 0x32c8 world payload; current atlas evidence still treats that band as distinct from the issue-0x37 investor-confidence family."
|
"World analysis now also exports the fixed six-lane economic tuning float block from the same 0x32c8 world payload; current atlas evidence still treats that band as distinct from the issue-0x37 investor-confidence family."
|
||||||
|
|
@ -3089,6 +3124,7 @@ pub fn inspect_save_company_and_chairman_analysis_bytes(
|
||||||
selected_chairman_profile_id: selection_probe
|
selected_chairman_profile_id: selection_probe
|
||||||
.map(|probe| probe.selected_chairman_profile_id),
|
.map(|probe| probe.selected_chairman_profile_id),
|
||||||
world_selection_context,
|
world_selection_context,
|
||||||
|
world_issue_37,
|
||||||
world_economic_tuning,
|
world_economic_tuning,
|
||||||
company_entries,
|
company_entries,
|
||||||
chairman_entries,
|
chairman_entries,
|
||||||
|
|
@ -6454,6 +6490,11 @@ fn inspect_bundle_bytes(bytes: &[u8], file_extension_hint: Option<String>) -> Sm
|
||||||
file_extension_hint.as_deref(),
|
file_extension_hint.as_deref(),
|
||||||
container_profile.as_ref(),
|
container_profile.as_ref(),
|
||||||
);
|
);
|
||||||
|
let save_world_issue_37_probe = parse_save_world_issue_37_probe(
|
||||||
|
bytes,
|
||||||
|
file_extension_hint.as_deref(),
|
||||||
|
container_profile.as_ref(),
|
||||||
|
);
|
||||||
let save_world_economic_tuning_probe = parse_save_world_economic_tuning_probe(
|
let save_world_economic_tuning_probe = parse_save_world_economic_tuning_probe(
|
||||||
bytes,
|
bytes,
|
||||||
file_extension_hint.as_deref(),
|
file_extension_hint.as_deref(),
|
||||||
|
|
@ -6628,6 +6669,7 @@ fn inspect_bundle_bytes(bytes: &[u8], file_extension_hint: Option<String>) -> Sm
|
||||||
rt3_105_post_span_bridge_probe,
|
rt3_105_post_span_bridge_probe,
|
||||||
rt3_105_save_bridge_payload_probe,
|
rt3_105_save_bridge_payload_probe,
|
||||||
save_world_selection_context_probe,
|
save_world_selection_context_probe,
|
||||||
|
save_world_issue_37_probe,
|
||||||
save_world_economic_tuning_probe,
|
save_world_economic_tuning_probe,
|
||||||
save_company_collection_header_probe,
|
save_company_collection_header_probe,
|
||||||
save_chairman_profile_collection_header_probe,
|
save_chairman_profile_collection_header_probe,
|
||||||
|
|
@ -8160,6 +8202,76 @@ fn parse_save_world_selection_context_probe(
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_save_world_issue_37_probe(
|
||||||
|
bytes: &[u8],
|
||||||
|
file_extension_hint: Option<&str>,
|
||||||
|
container_profile: Option<&SmpContainerProfile>,
|
||||||
|
) -> Option<SmpSaveWorldIssue37Probe> {
|
||||||
|
if file_extension_hint != Some("gms") {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let profile = container_profile?;
|
||||||
|
let supported = matches!(
|
||||||
|
profile.profile_family.as_str(),
|
||||||
|
"rt3-classic-save-container-v1"
|
||||||
|
| "rt3-105-save-container-v1"
|
||||||
|
| "rt3-105-scenario-save-container-v1"
|
||||||
|
| "rt3-105-alt-save-container-v1"
|
||||||
|
);
|
||||||
|
if !supported {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
for chunk_tag_offset in find_u32_le_offsets(bytes, RT3_SAVE_WORLD_BLOCK_CHUNK_TAG) {
|
||||||
|
let payload_offset = chunk_tag_offset + 4;
|
||||||
|
let next_chunk_tag_offset = payload_offset.checked_add(RT3_SAVE_WORLD_BLOCK_LEN)?;
|
||||||
|
if read_u32_at(bytes, next_chunk_tag_offset) != Some(RT3_SAVE_WORLD_BLOCK_NEXT_CHUNK_TAG) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let issue_value_lane = build_save_dword_candidate(
|
||||||
|
bytes,
|
||||||
|
payload_offset,
|
||||||
|
"issue_0x37_value",
|
||||||
|
RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_VALUE_RELATIVE_OFFSET,
|
||||||
|
)?;
|
||||||
|
let multiplier_lane = build_save_dword_candidate(
|
||||||
|
bytes,
|
||||||
|
payload_offset,
|
||||||
|
"issue_0x37_multiplier",
|
||||||
|
RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_MULTIPLIER_RELATIVE_OFFSET,
|
||||||
|
)?;
|
||||||
|
return Some(SmpSaveWorldIssue37Probe {
|
||||||
|
profile_family: profile.profile_family.clone(),
|
||||||
|
source_kind: "save-direct-world-block".to_string(),
|
||||||
|
semantic_family: "scenario-save-world-issue-0x37".to_string(),
|
||||||
|
chunk_tag_offset,
|
||||||
|
payload_offset,
|
||||||
|
payload_len: RT3_SAVE_WORLD_BLOCK_LEN,
|
||||||
|
payload_len_hex: format!("0x{:x}", RT3_SAVE_WORLD_BLOCK_LEN),
|
||||||
|
issue_value_lane,
|
||||||
|
multiplier_lane,
|
||||||
|
evidence: vec![
|
||||||
|
format!(
|
||||||
|
"chunk tag 0x32c8 at 0x{chunk_tag_offset:x} matches the fixed [world+0x04] save block"
|
||||||
|
),
|
||||||
|
format!(
|
||||||
|
"next chunk tag 0x32c9 appears at 0x{next_chunk_tag_offset:x}, matching the documented 0x4f2c payload span"
|
||||||
|
),
|
||||||
|
format!(
|
||||||
|
"issue value lane uses payload +0x{:x} ([world+0x2d]); atlas notes tie 0x004339b0 to the clamped 0..4 issue-0x37 setter there",
|
||||||
|
RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_VALUE_RELATIVE_OFFSET
|
||||||
|
),
|
||||||
|
format!(
|
||||||
|
"multiplier lane uses payload +0x{:x} ([world+0x29]); atlas notes tie 0x004339b0 to one companion scalar at that lane before company share-price refresh",
|
||||||
|
RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_MULTIPLIER_RELATIVE_OFFSET
|
||||||
|
),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_save_world_economic_tuning_probe(
|
fn parse_save_world_economic_tuning_probe(
|
||||||
bytes: &[u8],
|
bytes: &[u8],
|
||||||
file_extension_hint: Option<&str>,
|
file_extension_hint: Option<&str>,
|
||||||
|
|
@ -14812,6 +14924,42 @@ mod tests {
|
||||||
assert_eq!(probe.tuning_lanes[5].value_f32, 15.25);
|
assert_eq!(probe.tuning_lanes[5].value_f32, 15.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn parses_save_world_issue_37_probe_from_fixed_world_block() {
|
||||||
|
let mut bytes = vec![0u8; 0x8000];
|
||||||
|
let chunk_tag_offset = 0x3ceusize;
|
||||||
|
let payload_offset = chunk_tag_offset + 4;
|
||||||
|
bytes[chunk_tag_offset..chunk_tag_offset + 4]
|
||||||
|
.copy_from_slice(&RT3_SAVE_WORLD_BLOCK_CHUNK_TAG.to_le_bytes());
|
||||||
|
bytes[payload_offset + RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_VALUE_RELATIVE_OFFSET
|
||||||
|
..payload_offset + RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_VALUE_RELATIVE_OFFSET + 4]
|
||||||
|
.copy_from_slice(&3u32.to_le_bytes());
|
||||||
|
bytes[payload_offset + RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_MULTIPLIER_RELATIVE_OFFSET
|
||||||
|
..payload_offset + RT3_SAVE_WORLD_BLOCK_ISSUE_0X37_MULTIPLIER_RELATIVE_OFFSET + 4]
|
||||||
|
.copy_from_slice(&0.06f32.to_bits().to_le_bytes());
|
||||||
|
let next_chunk_offset = payload_offset + RT3_SAVE_WORLD_BLOCK_LEN;
|
||||||
|
bytes[next_chunk_offset..next_chunk_offset + 4]
|
||||||
|
.copy_from_slice(&RT3_SAVE_WORLD_BLOCK_NEXT_CHUNK_TAG.to_le_bytes());
|
||||||
|
|
||||||
|
let probe = parse_save_world_issue_37_probe(
|
||||||
|
&bytes,
|
||||||
|
Some("gms"),
|
||||||
|
Some(&SmpContainerProfile {
|
||||||
|
profile_family: "rt3-105-save-container-v1".to_string(),
|
||||||
|
profile_evidence: vec![],
|
||||||
|
is_known_profile: true,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.expect("world issue-0x37 probe should parse");
|
||||||
|
|
||||||
|
assert_eq!(probe.chunk_tag_offset, chunk_tag_offset);
|
||||||
|
assert_eq!(probe.payload_offset, payload_offset);
|
||||||
|
assert_eq!(probe.issue_value_lane.relative_offset_hex, "0x29");
|
||||||
|
assert_eq!(probe.issue_value_lane.value_i32, 3);
|
||||||
|
assert_eq!(probe.multiplier_lane.relative_offset_hex, "0x25");
|
||||||
|
assert!((probe.multiplier_lane.value_f32 - 0.06).abs() < f32::EPSILON);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn loads_selection_only_company_and_chairman_context_from_save_world_probe() {
|
fn loads_selection_only_company_and_chairman_context_from_save_world_probe() {
|
||||||
let mut report = inspect_smp_bytes(&[]);
|
let mut report = inspect_smp_bytes(&[]);
|
||||||
|
|
|
||||||
|
|
@ -98,8 +98,8 @@ The highest-value next passes are now:
|
||||||
can execute from standalone save-slice fixtures without overlay snapshots when that context is
|
can execute from standalone save-slice fixtures without overlay snapshots when that context is
|
||||||
present; raw `.gms` inspection/export now reconstructs those company/chairman collections
|
present; raw `.gms` inspection/export now reconstructs those company/chairman collections
|
||||||
directly from save-side tagged record families, while the fixed save-side `0x32c8` world block
|
directly from save-side tagged record families, while the fixed save-side `0x32c8` world block
|
||||||
still provides selected company/chairman ids plus the grounded campaign-override and
|
still provides selected company/chairman ids plus the grounded campaign-override, issue-`0x37`
|
||||||
chairman-slot / role-gate analysis bytes; the current raw-save frontier is narrower now:
|
value/multiplier, and chairman-slot / role-gate analysis bytes; the current raw-save frontier is narrower now:
|
||||||
company/chairman identity, active flags, links, chairman cash, chairman holdings, chairman
|
company/chairman identity, active flags, links, chairman cash, chairman holdings, chairman
|
||||||
purchasing power, company debt, company track-laying capacity, and collection counts are
|
purchasing power, company debt, company track-laying capacity, and collection counts are
|
||||||
grounded, while broader company
|
grounded, while broader company
|
||||||
|
|
@ -107,9 +107,12 @@ The highest-value next passes are now:
|
||||||
defaults until their raw offsets are pinned more strongly; the offline analysis command
|
defaults until their raw offsets are pinned more strongly; the offline analysis command
|
||||||
`runtime inspect-save-company-chairman <save.gms>` now dumps those remaining raw record
|
`runtime inspect-save-company-chairman <save.gms>` now dumps those remaining raw record
|
||||||
candidates directly from the rehosted parser, including fixed-world chairman slot / role-gate
|
candidates directly from the rehosted parser, including fixed-world chairman slot / role-gate
|
||||||
context, the fixed-world six-float economic tuning band, derived holdings-at-share-price and
|
context, the grounded fixed-world issue-`0x37` pair, the separate six-float economic tuning
|
||||||
cached purchasing-power totals,
|
band, derived holdings-at-share-price and cached purchasing-power totals,
|
||||||
context, company dword candidate windows, and richer chairman qword cache views
|
context, company dword candidate windows, and richer chairman qword cache views
|
||||||
|
- the project rule on the remaining closure work is now explicit too: when one runtime-facing field
|
||||||
|
is still ambiguous, prefer rehosting the owning source state or real reader/setter family first
|
||||||
|
instead of guessing another derived leaf field from neighboring raw offsets
|
||||||
- a checked-in `EventEffects` export now exists at
|
- a checked-in `EventEffects` export now exists at
|
||||||
`artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer
|
`artifacts/exports/rt3-1.06/event-effects-table.json`, and a checked-in semantic closure layer
|
||||||
now exists at `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json`
|
now exists at `artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json`
|
||||||
|
|
|
||||||
|
|
@ -60,15 +60,16 @@ Implemented today:
|
||||||
chairman-targeted descriptor/condition batches execute from standalone save-slice fixtures
|
chairman-targeted descriptor/condition batches execute from standalone save-slice fixtures
|
||||||
without overlay snapshots when the checked-in documents include that context, and raw `.gms`
|
without overlay snapshots when the checked-in documents include that context, and raw `.gms`
|
||||||
inspection/export now reconstructs company/chairman direct-record entries too; the fixed
|
inspection/export now reconstructs company/chairman direct-record entries too; the fixed
|
||||||
`0x32c8` world block still contributes selected ids plus the grounded campaign-override and
|
`0x32c8` world block still contributes selected ids plus the grounded campaign-override,
|
||||||
chairman slot / role-gate analysis bytes, while the tagged company and chairman/profile
|
issue-`0x37` value/multiplier, and chairman slot / role-gate analysis bytes, while the tagged company and chairman/profile
|
||||||
collections now provide save-native roster entries and `observed_entry_count`; raw company debt
|
collections now provide save-native roster entries and `observed_entry_count`; raw company debt
|
||||||
from the bond table and raw company track-laying capacity from the record tail are grounded too,
|
from the bond table and raw company track-laying capacity from the record tail are grounded too,
|
||||||
and chairman purchasing power now reuses the strongest nonnegative cached qword total from the
|
and chairman purchasing power now reuses the strongest nonnegative cached qword total from the
|
||||||
`[profile+0x1e9..]` band plus current cash instead of collapsing to plain net worth;
|
`[profile+0x1e9..]` band plus current cash instead of collapsing to plain net worth;
|
||||||
the same fixed world payload now exposes the six-float economic tuning band
|
the same fixed world payload now exposes the grounded issue-`0x37` pair at `[world+0x29/+0x2d]`
|
||||||
`[world+0x0be2..+0x0bf6]` through save inspection too, but current atlas evidence still keeps
|
and the separate six-float economic tuning band `[world+0x0be2..+0x0bf6]` through save
|
||||||
that editor-tuning family separate from the company-governance issue lanes;
|
inspection too, but current atlas evidence still keeps that editor-tuning family separate from
|
||||||
|
the company-governance issue lanes;
|
||||||
and `runtime inspect-save-company-chairman <save.gms>` now exposes the remaining raw
|
and `runtime inspect-save-company-chairman <save.gms>` now exposes the remaining raw
|
||||||
company/chairman scalar candidates directly from the rehosted parser, including fixed-world
|
company/chairman scalar candidates directly from the rehosted parser, including fixed-world
|
||||||
chairman slot / role-gate context, company dword candidate windows, richer chairman qword
|
chairman slot / role-gate context, company dword candidate windows, richer chairman qword
|
||||||
|
|
@ -521,6 +522,8 @@ The currently implemented normalized runtime surface is:
|
||||||
normalized runtime-effect vocabulary with staged event-record mutation
|
normalized runtime-effect vocabulary with staged event-record mutation
|
||||||
- save-side inspection and partial state projection for `.smp` inputs, including per-record packed
|
- save-side inspection and partial state projection for `.smp` inputs, including per-record packed
|
||||||
event summaries and selective executable import
|
event summaries and selective executable import
|
||||||
|
- closure policy on the remaining frontier: prefer rehosting the owning source state and the real
|
||||||
|
reader/setter family over guessing one more derived leaf metric from nearby save offsets
|
||||||
- tracked save-slice documents plus save-slice-backed fixture loading for captured-runtime coverage
|
- tracked save-slice documents plus save-slice-backed fixture loading for captured-runtime coverage
|
||||||
|
|
||||||
Checked-in fixture families already include:
|
Checked-in fixture families already include:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue