diff --git a/README.md b/README.md index 250a882..bed75fa 100644 --- a/README.md +++ b/README.md @@ -61,20 +61,18 @@ descriptors now have bounded runtime landing surfaces too: descriptor `105` `All Cargo Prices` plus descriptors `177..179` `All Cargo Production` / `All Factory Production` / `All Farm/Mine Production` import into event-owned cargo override state, and the grounded named cargo-production strip `180..229` now -imports into named cargo production overrides too. The named cargo-price strip `106..176` -remains explicit `blocked_evidence_blocked_descriptor` parity until descriptor ordering is pinned -more strongly, but the semantic catalog now gives that band stable `Named Cargo Price Slot N` -labels instead of anonymous `Unknown Cargo Price` residue. The checked-in static corpora now make -that boundary more explicit too: the broader 1.06 CargoTypes corpus has `51` names and the 1.05 -corpus has `41`, so neither static set closes the `71`-row named price strip on its own. A new -offline cargo-source inspector now pushes that groundwork further in rehosted code: the checked-in +imports into named cargo production overrides too, and the named cargo-price strip `106..176` now +imports into named cargo price overrides as well. The checked-in static selector reconstruction is +now explicit: the broader 1.06 CargoTypes corpus has `51` names, the Cargo106 `cargoSkin` corpus +has `70`, and the rehosted offline selector builder now closes the `71`-row named price strip as +`cargoSkin` plus the core `Rock` carry-over. The checked-in `artifacts/exports/rt3-1.06/economy-cargo-sources.json` report parses both `CargoTypes` and the `Cargo106.PK4` `cargoSkin` descriptors, normalizes localized `~####Name` tokens into visible -names, builds a merged live cargo registry, and derives an exact named cargo-production selector -from the checked-in bindings. Dedicated CLI inspector commands now expose that production selector -and the unresolved price-selector candidate registry directly. The same report still shows that the -current 1.06 visible-name union is `80`, not `71`, so source recovery alone still does not prove -the live price-selector ordering. The +names, builds a merged live cargo registry, and now derives exact named cargo-production and named +cargo-price selectors from the checked-in bindings. Dedicated CLI inspector commands now expose +both grounded selectors directly, while the same report still makes the residual live-registry gap +explicit by showing the nine excluded CargoTypes-only industrial names outside the 71-row price +strip. The add-building strip `503..519` is now explicitly classified as recovered shell-owned descriptor parity rather than generic unresolved residue. The first grounded condition-side unlock now exists for negative-sentinel `raw_condition_id = -1` company scopes, and diff --git a/artifacts/exports/rt3-1.06/economy-cargo-sources.json b/artifacts/exports/rt3-1.06/economy-cargo-sources.json index 5e72d26..835948f 100644 --- a/artifacts/exports/rt3-1.06/economy-cargo-sources.json +++ b/artifacts/exports/rt3-1.06/economy-cargo-sources.json @@ -974,36 +974,15 @@ ], "price_selector_candidate_excess_count": 9, "price_selector_candidate_only_visible_names": [ - "Beer", - "Candidates", - "China", - "Containers", - "Detergents", - "Deuterium", - "Energy", - "Fish", - "Food", - "Glass", - "Gravel", - "Money", - "Newspaper", - "Paint", - "Perfume", - "Potash", - "Pottery", - "Prisoners", - "Rock", - "Salt", - "Sand", - "Spaceships", - "Syrup", - "Tea", - "Tin", - "Tobacco", - "Tools", - "Valuables", - "Wine", - "Wire" + "Ceramics", + "Concrete", + "Crystals", + "Dye", + "Electronics", + "Ingots", + "Machinery", + "Medicine", + "Ore" ], "production_selector": { "selector_kind": "named_cargo_production", @@ -1459,19 +1438,18 @@ ] }, "price_selector": { - "selector_kind": "named_cargo_price_candidate_registry", - "exact_resolution": false, + "selector_kind": "named_cargo_price", + "exact_resolution": true, "selector_row_count": 71, "candidate_registry_count": 80, "notes": [ - "This is the current merged visible-name registry, sorted lexicographically, not a claimed reproduction of the original price selector.", - "The merged visible-name registry has 80 entries, so the exact 71-row price-selector binding remains unresolved by static source recovery alone.", - "Current unresolved gap is 9 excess candidate names relative to the descriptor strip." + "This selector is grounded from the checked-in named cargo price bindings artifact.", + "The current grounded order matches the 71-row named cargo-price descriptor strip." ], "entries": [ { "selector_index": 1, - "descriptor_id": null, + "descriptor_id": 106, "visible_name": "Alcohol", "source_kinds": [ "cargo_types", @@ -1480,7 +1458,7 @@ }, { "selector_index": 2, - "descriptor_id": null, + "descriptor_id": 107, "visible_name": "Aluminum", "source_kinds": [ "cargo_types", @@ -1489,7 +1467,7 @@ }, { "selector_index": 3, - "descriptor_id": null, + "descriptor_id": 108, "visible_name": "Ammunition", "source_kinds": [ "cargo_types", @@ -1498,7 +1476,7 @@ }, { "selector_index": 4, - "descriptor_id": null, + "descriptor_id": 109, "visible_name": "Automobiles", "source_kinds": [ "cargo_types", @@ -1507,7 +1485,7 @@ }, { "selector_index": 5, - "descriptor_id": null, + "descriptor_id": 110, "visible_name": "Bauxite", "source_kinds": [ "cargo_types", @@ -1516,7 +1494,7 @@ }, { "selector_index": 6, - "descriptor_id": null, + "descriptor_id": 111, "visible_name": "Beer", "source_kinds": [ "cargo_skin" @@ -1524,7 +1502,7 @@ }, { "selector_index": 7, - "descriptor_id": null, + "descriptor_id": 112, "visible_name": "Candidates", "source_kinds": [ "cargo_skin" @@ -1532,15 +1510,7 @@ }, { "selector_index": 8, - "descriptor_id": null, - "visible_name": "Ceramics", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 9, - "descriptor_id": null, + "descriptor_id": 113, "visible_name": "Cheese", "source_kinds": [ "cargo_types", @@ -1548,8 +1518,8 @@ ] }, { - "selector_index": 10, - "descriptor_id": null, + "selector_index": 9, + "descriptor_id": 114, "visible_name": "Chemicals", "source_kinds": [ "cargo_types", @@ -1557,16 +1527,16 @@ ] }, { - "selector_index": 11, - "descriptor_id": null, + "selector_index": 10, + "descriptor_id": 115, "visible_name": "China", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 12, - "descriptor_id": null, + "selector_index": 11, + "descriptor_id": 116, "visible_name": "Clothing", "source_kinds": [ "cargo_types", @@ -1574,8 +1544,8 @@ ] }, { - "selector_index": 13, - "descriptor_id": null, + "selector_index": 12, + "descriptor_id": 117, "visible_name": "Coal", "source_kinds": [ "cargo_types", @@ -1583,8 +1553,8 @@ ] }, { - "selector_index": 14, - "descriptor_id": null, + "selector_index": 13, + "descriptor_id": 118, "visible_name": "Coffee", "source_kinds": [ "cargo_types", @@ -1592,24 +1562,16 @@ ] }, { - "selector_index": 15, - "descriptor_id": null, - "visible_name": "Concrete", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 16, - "descriptor_id": null, + "selector_index": 14, + "descriptor_id": 119, "visible_name": "Containers", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 17, - "descriptor_id": null, + "selector_index": 15, + "descriptor_id": 120, "visible_name": "Corn", "source_kinds": [ "cargo_types", @@ -1617,8 +1579,8 @@ ] }, { - "selector_index": 18, - "descriptor_id": null, + "selector_index": 16, + "descriptor_id": 121, "visible_name": "Cotton", "source_kinds": [ "cargo_types", @@ -1626,32 +1588,24 @@ ] }, { - "selector_index": 19, - "descriptor_id": null, - "visible_name": "Crystals", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 20, - "descriptor_id": null, + "selector_index": 17, + "descriptor_id": 122, "visible_name": "Detergents", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 21, - "descriptor_id": null, + "selector_index": 18, + "descriptor_id": 123, "visible_name": "Deuterium", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 22, - "descriptor_id": null, + "selector_index": 19, + "descriptor_id": 124, "visible_name": "Diesel", "source_kinds": [ "cargo_types", @@ -1659,32 +1613,16 @@ ] }, { - "selector_index": 23, - "descriptor_id": null, - "visible_name": "Dye", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 24, - "descriptor_id": null, - "visible_name": "Electronics", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 25, - "descriptor_id": null, + "selector_index": 20, + "descriptor_id": 125, "visible_name": "Energy", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 26, - "descriptor_id": null, + "selector_index": 21, + "descriptor_id": 126, "visible_name": "Fertilizer", "source_kinds": [ "cargo_types", @@ -1692,24 +1630,24 @@ ] }, { - "selector_index": 27, - "descriptor_id": null, + "selector_index": 22, + "descriptor_id": 127, "visible_name": "Fish", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 28, - "descriptor_id": null, + "selector_index": 23, + "descriptor_id": 128, "visible_name": "Food", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 29, - "descriptor_id": null, + "selector_index": 24, + "descriptor_id": 129, "visible_name": "Furniture", "source_kinds": [ "cargo_types", @@ -1717,16 +1655,16 @@ ] }, { - "selector_index": 30, - "descriptor_id": null, + "selector_index": 25, + "descriptor_id": 130, "visible_name": "Glass", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 31, - "descriptor_id": null, + "selector_index": 26, + "descriptor_id": 131, "visible_name": "Goods", "source_kinds": [ "cargo_types", @@ -1734,8 +1672,8 @@ ] }, { - "selector_index": 32, - "descriptor_id": null, + "selector_index": 27, + "descriptor_id": 132, "visible_name": "Grain", "source_kinds": [ "cargo_types", @@ -1743,24 +1681,16 @@ ] }, { - "selector_index": 33, - "descriptor_id": null, + "selector_index": 28, + "descriptor_id": 133, "visible_name": "Gravel", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 34, - "descriptor_id": null, - "visible_name": "Ingots", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 35, - "descriptor_id": null, + "selector_index": 29, + "descriptor_id": 134, "visible_name": "Iron", "source_kinds": [ "cargo_types", @@ -1768,8 +1698,8 @@ ] }, { - "selector_index": 36, - "descriptor_id": null, + "selector_index": 30, + "descriptor_id": 135, "visible_name": "Livestock", "source_kinds": [ "cargo_types", @@ -1777,8 +1707,8 @@ ] }, { - "selector_index": 37, - "descriptor_id": null, + "selector_index": 31, + "descriptor_id": 136, "visible_name": "Logs", "source_kinds": [ "cargo_types", @@ -1786,8 +1716,8 @@ ] }, { - "selector_index": 38, - "descriptor_id": null, + "selector_index": 32, + "descriptor_id": 137, "visible_name": "Lumber", "source_kinds": [ "cargo_types", @@ -1795,16 +1725,8 @@ ] }, { - "selector_index": 39, - "descriptor_id": null, - "visible_name": "Machinery", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 40, - "descriptor_id": null, + "selector_index": 33, + "descriptor_id": 138, "visible_name": "Mail", "source_kinds": [ "cargo_types", @@ -1812,8 +1734,8 @@ ] }, { - "selector_index": 41, - "descriptor_id": null, + "selector_index": 34, + "descriptor_id": 139, "visible_name": "Meat", "source_kinds": [ "cargo_types", @@ -1821,16 +1743,8 @@ ] }, { - "selector_index": 42, - "descriptor_id": null, - "visible_name": "Medicine", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 43, - "descriptor_id": null, + "selector_index": 35, + "descriptor_id": 140, "visible_name": "Milk", "source_kinds": [ "cargo_types", @@ -1838,24 +1752,24 @@ ] }, { - "selector_index": 44, - "descriptor_id": null, + "selector_index": 36, + "descriptor_id": 141, "visible_name": "Money", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 45, - "descriptor_id": null, + "selector_index": 37, + "descriptor_id": 142, "visible_name": "Newspaper", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 46, - "descriptor_id": null, + "selector_index": 38, + "descriptor_id": 143, "visible_name": "Oil", "source_kinds": [ "cargo_types", @@ -1863,24 +1777,16 @@ ] }, { - "selector_index": 47, - "descriptor_id": null, - "visible_name": "Ore", - "source_kinds": [ - "cargo_types" - ] - }, - { - "selector_index": 48, - "descriptor_id": null, + "selector_index": 39, + "descriptor_id": 144, "visible_name": "Paint", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 49, - "descriptor_id": null, + "selector_index": 40, + "descriptor_id": 145, "visible_name": "Paper", "source_kinds": [ "cargo_types", @@ -1888,8 +1794,8 @@ ] }, { - "selector_index": 50, - "descriptor_id": null, + "selector_index": 41, + "descriptor_id": 146, "visible_name": "Passengers", "source_kinds": [ "cargo_types", @@ -1897,16 +1803,16 @@ ] }, { - "selector_index": 51, - "descriptor_id": null, + "selector_index": 42, + "descriptor_id": 147, "visible_name": "Perfume", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 52, - "descriptor_id": null, + "selector_index": 43, + "descriptor_id": 148, "visible_name": "Plastic", "source_kinds": [ "cargo_types", @@ -1914,32 +1820,32 @@ ] }, { - "selector_index": 53, - "descriptor_id": null, + "selector_index": 44, + "descriptor_id": 149, "visible_name": "Potash", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 54, - "descriptor_id": null, + "selector_index": 45, + "descriptor_id": 150, "visible_name": "Pottery", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 55, - "descriptor_id": null, + "selector_index": 46, + "descriptor_id": 151, "visible_name": "Prisoners", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 56, - "descriptor_id": null, + "selector_index": 47, + "descriptor_id": 152, "visible_name": "Produce", "source_kinds": [ "cargo_types", @@ -1947,8 +1853,8 @@ ] }, { - "selector_index": 57, - "descriptor_id": null, + "selector_index": 48, + "descriptor_id": 153, "visible_name": "Pulpwood", "source_kinds": [ "cargo_types", @@ -1956,8 +1862,8 @@ ] }, { - "selector_index": 58, - "descriptor_id": null, + "selector_index": 49, + "descriptor_id": 154, "visible_name": "Rice", "source_kinds": [ "cargo_types", @@ -1965,16 +1871,16 @@ ] }, { - "selector_index": 59, - "descriptor_id": null, + "selector_index": 50, + "descriptor_id": 155, "visible_name": "Rock", "source_kinds": [ "cargo_types" ] }, { - "selector_index": 60, - "descriptor_id": null, + "selector_index": 51, + "descriptor_id": 156, "visible_name": "Rubber", "source_kinds": [ "cargo_types", @@ -1982,32 +1888,32 @@ ] }, { - "selector_index": 61, - "descriptor_id": null, + "selector_index": 52, + "descriptor_id": 157, "visible_name": "Salt", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 62, - "descriptor_id": null, + "selector_index": 53, + "descriptor_id": 158, "visible_name": "Sand", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 63, - "descriptor_id": null, + "selector_index": 54, + "descriptor_id": 159, "visible_name": "Spaceships", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 64, - "descriptor_id": null, + "selector_index": 55, + "descriptor_id": 160, "visible_name": "Steel", "source_kinds": [ "cargo_types", @@ -2015,8 +1921,8 @@ ] }, { - "selector_index": 65, - "descriptor_id": null, + "selector_index": 56, + "descriptor_id": 161, "visible_name": "Sugar", "source_kinds": [ "cargo_types", @@ -2024,32 +1930,32 @@ ] }, { - "selector_index": 66, - "descriptor_id": null, + "selector_index": 57, + "descriptor_id": 162, "visible_name": "Syrup", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 67, - "descriptor_id": null, + "selector_index": 58, + "descriptor_id": 163, "visible_name": "Tea", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 68, - "descriptor_id": null, + "selector_index": 59, + "descriptor_id": 164, "visible_name": "Tin", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 69, - "descriptor_id": null, + "selector_index": 60, + "descriptor_id": 165, "visible_name": "Tires", "source_kinds": [ "cargo_types", @@ -2057,24 +1963,24 @@ ] }, { - "selector_index": 70, - "descriptor_id": null, + "selector_index": 61, + "descriptor_id": 166, "visible_name": "Tobacco", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 71, - "descriptor_id": null, + "selector_index": 62, + "descriptor_id": 167, "visible_name": "Tools", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 72, - "descriptor_id": null, + "selector_index": 63, + "descriptor_id": 168, "visible_name": "Toys", "source_kinds": [ "cargo_types", @@ -2082,8 +1988,8 @@ ] }, { - "selector_index": 73, - "descriptor_id": null, + "selector_index": 64, + "descriptor_id": 169, "visible_name": "Troops", "source_kinds": [ "cargo_types", @@ -2091,8 +1997,8 @@ ] }, { - "selector_index": 74, - "descriptor_id": null, + "selector_index": 65, + "descriptor_id": 170, "visible_name": "Uranium", "source_kinds": [ "cargo_types", @@ -2100,16 +2006,16 @@ ] }, { - "selector_index": 75, - "descriptor_id": null, + "selector_index": 66, + "descriptor_id": 171, "visible_name": "Valuables", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 76, - "descriptor_id": null, + "selector_index": 67, + "descriptor_id": 172, "visible_name": "Waste", "source_kinds": [ "cargo_types", @@ -2117,8 +2023,8 @@ ] }, { - "selector_index": 77, - "descriptor_id": null, + "selector_index": 68, + "descriptor_id": 173, "visible_name": "Weapons", "source_kinds": [ "cargo_types", @@ -2126,24 +2032,24 @@ ] }, { - "selector_index": 78, - "descriptor_id": null, + "selector_index": 69, + "descriptor_id": 174, "visible_name": "Wine", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 79, - "descriptor_id": null, + "selector_index": 70, + "descriptor_id": 175, "visible_name": "Wire", "source_kinds": [ "cargo_skin" ] }, { - "selector_index": 80, - "descriptor_id": null, + "selector_index": 71, + "descriptor_id": 176, "visible_name": "Wool", "source_kinds": [ "cargo_types", @@ -2155,7 +2061,7 @@ "notes": [ "Named cargo-price descriptors 106..176 span 71 rows, while named cargo-production descriptors 180..229 span 50 rows.", "The inspected CargoTypes corpus exposes 51 visible names, the inspected cargoSkin corpus exposes 70 visible names, and their union exposes 80 visible names.", - "That visible-name union still does not match the 71-row named cargo-price strip, so this offline source reconstruction is groundwork rather than a complete price-selector binding." + "The checked-in bindings now close the 71-row named cargo-price strip on top of the merged live cargo registry." ], "cargo_type_entries": [ { diff --git a/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json b/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json index 38aa06f..3b8f36c 100644 --- a/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json +++ b/artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json @@ -8,11 +8,508 @@ }, "notes": [ "Named cargo production bindings are grounded from the checked-in 1.06 CargoTypes corpus and the candidate-loader evidence that live cargo names are materialized in lexicographic order.", - "The checked-in static CargoTypes corpora do not close the named cargo price strip by themselves: the broader rt3 corpus has 51 names, the rt3_105 corpus has 41 names, and neither matches the 71-row named price band.", - "The named production strip has 50 rows, so the checked-in binding covers the 50-name lexicographic corpus used by the grounded 1.06 runtime baseline and leaves the named cargo price strip unresolved.", - "Rock remains outside the grounded 50-row production strip in this batch." + "Named cargo price bindings are grounded from the rehosted static selector reconstruction: the 70-name Cargo106 cargoSkin corpus plus the core CargoTypes-only Rock entry close the 71-row price strip exactly.", + "The named production strip has 50 rows, so the checked-in binding still covers the 50-name lexicographic corpus used by the grounded 1.06 runtime baseline.", + "The named price selector excludes the remaining CargoTypes-only industrial rows Ceramics, Concrete, Crystals, Dye, Electronics, Ingots, Machinery, Medicine, and Ore." ], "bindings": [ + { + "descriptor_id": 106, + "band": "cargo_price_named", + "cargo_name": "Alcohol", + "binding_index": 1, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 107, + "band": "cargo_price_named", + "cargo_name": "Aluminum", + "binding_index": 2, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 108, + "band": "cargo_price_named", + "cargo_name": "Ammunition", + "binding_index": 3, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 109, + "band": "cargo_price_named", + "cargo_name": "Automobiles", + "binding_index": 4, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 110, + "band": "cargo_price_named", + "cargo_name": "Bauxite", + "binding_index": 5, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 111, + "band": "cargo_price_named", + "cargo_name": "Beer", + "binding_index": 6, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 112, + "band": "cargo_price_named", + "cargo_name": "Candidates", + "binding_index": 7, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 113, + "band": "cargo_price_named", + "cargo_name": "Cheese", + "binding_index": 8, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 114, + "band": "cargo_price_named", + "cargo_name": "Chemicals", + "binding_index": 9, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 115, + "band": "cargo_price_named", + "cargo_name": "China", + "binding_index": 10, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 116, + "band": "cargo_price_named", + "cargo_name": "Clothing", + "binding_index": 11, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 117, + "band": "cargo_price_named", + "cargo_name": "Coal", + "binding_index": 12, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 118, + "band": "cargo_price_named", + "cargo_name": "Coffee", + "binding_index": 13, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 119, + "band": "cargo_price_named", + "cargo_name": "Containers", + "binding_index": 14, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 120, + "band": "cargo_price_named", + "cargo_name": "Corn", + "binding_index": 15, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 121, + "band": "cargo_price_named", + "cargo_name": "Cotton", + "binding_index": 16, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 122, + "band": "cargo_price_named", + "cargo_name": "Detergents", + "binding_index": 17, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 123, + "band": "cargo_price_named", + "cargo_name": "Deuterium", + "binding_index": 18, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 124, + "band": "cargo_price_named", + "cargo_name": "Diesel", + "binding_index": 19, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 125, + "band": "cargo_price_named", + "cargo_name": "Energy", + "binding_index": 20, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 126, + "band": "cargo_price_named", + "cargo_name": "Fertilizer", + "binding_index": 21, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 127, + "band": "cargo_price_named", + "cargo_name": "Fish", + "binding_index": 22, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 128, + "band": "cargo_price_named", + "cargo_name": "Food", + "binding_index": 23, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 129, + "band": "cargo_price_named", + "cargo_name": "Furniture", + "binding_index": 24, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 130, + "band": "cargo_price_named", + "cargo_name": "Glass", + "binding_index": 25, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 131, + "band": "cargo_price_named", + "cargo_name": "Goods", + "binding_index": 26, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 132, + "band": "cargo_price_named", + "cargo_name": "Grain", + "binding_index": 27, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 133, + "band": "cargo_price_named", + "cargo_name": "Gravel", + "binding_index": 28, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 134, + "band": "cargo_price_named", + "cargo_name": "Iron", + "binding_index": 29, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 135, + "band": "cargo_price_named", + "cargo_name": "Livestock", + "binding_index": 30, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 136, + "band": "cargo_price_named", + "cargo_name": "Logs", + "binding_index": 31, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 137, + "band": "cargo_price_named", + "cargo_name": "Lumber", + "binding_index": 32, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 138, + "band": "cargo_price_named", + "cargo_name": "Mail", + "binding_index": 33, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 139, + "band": "cargo_price_named", + "cargo_name": "Meat", + "binding_index": 34, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 140, + "band": "cargo_price_named", + "cargo_name": "Milk", + "binding_index": 35, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 141, + "band": "cargo_price_named", + "cargo_name": "Money", + "binding_index": 36, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 142, + "band": "cargo_price_named", + "cargo_name": "Newspaper", + "binding_index": 37, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 143, + "band": "cargo_price_named", + "cargo_name": "Oil", + "binding_index": 38, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 144, + "band": "cargo_price_named", + "cargo_name": "Paint", + "binding_index": 39, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 145, + "band": "cargo_price_named", + "cargo_name": "Paper", + "binding_index": 40, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 146, + "band": "cargo_price_named", + "cargo_name": "Passengers", + "binding_index": 41, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 147, + "band": "cargo_price_named", + "cargo_name": "Perfume", + "binding_index": 42, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 148, + "band": "cargo_price_named", + "cargo_name": "Plastic", + "binding_index": 43, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 149, + "band": "cargo_price_named", + "cargo_name": "Potash", + "binding_index": 44, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 150, + "band": "cargo_price_named", + "cargo_name": "Pottery", + "binding_index": 45, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 151, + "band": "cargo_price_named", + "cargo_name": "Prisoners", + "binding_index": 46, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 152, + "band": "cargo_price_named", + "cargo_name": "Produce", + "binding_index": 47, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 153, + "band": "cargo_price_named", + "cargo_name": "Pulpwood", + "binding_index": 48, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 154, + "band": "cargo_price_named", + "cargo_name": "Rice", + "binding_index": 49, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 155, + "band": "cargo_price_named", + "cargo_name": "Rock", + "binding_index": 50, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 156, + "band": "cargo_price_named", + "cargo_name": "Rubber", + "binding_index": 51, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 157, + "band": "cargo_price_named", + "cargo_name": "Salt", + "binding_index": 52, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 158, + "band": "cargo_price_named", + "cargo_name": "Sand", + "binding_index": 53, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 159, + "band": "cargo_price_named", + "cargo_name": "Spaceships", + "binding_index": 54, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 160, + "band": "cargo_price_named", + "cargo_name": "Steel", + "binding_index": 55, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 161, + "band": "cargo_price_named", + "cargo_name": "Sugar", + "binding_index": 56, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 162, + "band": "cargo_price_named", + "cargo_name": "Syrup", + "binding_index": 57, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 163, + "band": "cargo_price_named", + "cargo_name": "Tea", + "binding_index": 58, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 164, + "band": "cargo_price_named", + "cargo_name": "Tin", + "binding_index": 59, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 165, + "band": "cargo_price_named", + "cargo_name": "Tires", + "binding_index": 60, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 166, + "band": "cargo_price_named", + "cargo_name": "Tobacco", + "binding_index": 61, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 167, + "band": "cargo_price_named", + "cargo_name": "Tools", + "binding_index": 62, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 168, + "band": "cargo_price_named", + "cargo_name": "Toys", + "binding_index": 63, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 169, + "band": "cargo_price_named", + "cargo_name": "Troops", + "binding_index": 64, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 170, + "band": "cargo_price_named", + "cargo_name": "Uranium", + "binding_index": 65, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 171, + "band": "cargo_price_named", + "cargo_name": "Valuables", + "binding_index": 66, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 172, + "band": "cargo_price_named", + "cargo_name": "Waste", + "binding_index": 67, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 173, + "band": "cargo_price_named", + "cargo_name": "Weapons", + "binding_index": 68, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 174, + "band": "cargo_price_named", + "cargo_name": "Wine", + "binding_index": 69, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 175, + "band": "cargo_price_named", + "cargo_name": "Wire", + "binding_index": 70, + "binding_source": "static_selector_rehost" + }, + { + "descriptor_id": 176, + "band": "cargo_price_named", + "cargo_name": "Wool", + "binding_index": 71, + "binding_source": "static_selector_rehost" + }, { "descriptor_id": 180, "band": "cargo_production_named", diff --git a/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json b/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json index 6794893..8c9b42d 100644 --- a/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json +++ b/artifacts/exports/rt3-1.06/event-effects-semantic-catalog.json @@ -959,642 +959,642 @@ }, { "descriptor_id": 106, - "label": "Named Cargo Price Slot 1", + "label": "Alcohol Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 107, - "label": "Named Cargo Price Slot 2", + "label": "Aluminum Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 108, - "label": "Named Cargo Price Slot 3", + "label": "Ammunition Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 109, - "label": "Named Cargo Price Slot 4", + "label": "Automobiles Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 110, - "label": "Named Cargo Price Slot 5", + "label": "Bauxite Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 111, - "label": "Named Cargo Price Slot 6", + "label": "Beer Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 112, - "label": "Named Cargo Price Slot 7", + "label": "Candidates Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 113, - "label": "Named Cargo Price Slot 8", + "label": "Cheese Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 114, - "label": "Named Cargo Price Slot 9", + "label": "Chemicals Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 115, - "label": "Named Cargo Price Slot 10", + "label": "China Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 116, - "label": "Named Cargo Price Slot 11", + "label": "Clothing Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 117, - "label": "Named Cargo Price Slot 12", + "label": "Coal Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 118, - "label": "Named Cargo Price Slot 13", + "label": "Coffee Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 119, - "label": "Named Cargo Price Slot 14", + "label": "Containers Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 120, - "label": "Named Cargo Price Slot 15", + "label": "Corn Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 121, - "label": "Named Cargo Price Slot 16", + "label": "Cotton Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 122, - "label": "Named Cargo Price Slot 17", + "label": "Detergents Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 123, - "label": "Named Cargo Price Slot 18", + "label": "Deuterium Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 124, - "label": "Named Cargo Price Slot 19", + "label": "Diesel Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 125, - "label": "Named Cargo Price Slot 20", + "label": "Energy Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 126, - "label": "Named Cargo Price Slot 21", + "label": "Fertilizer Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 127, - "label": "Named Cargo Price Slot 22", + "label": "Fish Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 128, - "label": "Named Cargo Price Slot 23", + "label": "Food Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 129, - "label": "Named Cargo Price Slot 24", + "label": "Furniture Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 130, - "label": "Named Cargo Price Slot 25", + "label": "Glass Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 131, - "label": "Named Cargo Price Slot 26", + "label": "Goods Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 132, - "label": "Named Cargo Price Slot 27", + "label": "Grain Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 133, - "label": "Named Cargo Price Slot 28", + "label": "Gravel Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 134, - "label": "Named Cargo Price Slot 29", + "label": "Iron Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 135, - "label": "Named Cargo Price Slot 30", + "label": "Livestock Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 136, - "label": "Named Cargo Price Slot 31", + "label": "Logs Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 137, - "label": "Named Cargo Price Slot 32", + "label": "Lumber Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 138, - "label": "Named Cargo Price Slot 33", + "label": "Mail Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 139, - "label": "Named Cargo Price Slot 34", + "label": "Meat Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 140, - "label": "Named Cargo Price Slot 35", + "label": "Milk Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 141, - "label": "Named Cargo Price Slot 36", + "label": "Money Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 142, - "label": "Named Cargo Price Slot 37", + "label": "Newspaper Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 143, - "label": "Named Cargo Price Slot 38", + "label": "Oil Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 144, - "label": "Named Cargo Price Slot 39", + "label": "Paint Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 145, - "label": "Named Cargo Price Slot 40", + "label": "Paper Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 146, - "label": "Named Cargo Price Slot 41", + "label": "Passengers Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 147, - "label": "Named Cargo Price Slot 42", + "label": "Perfume Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 148, - "label": "Named Cargo Price Slot 43", + "label": "Plastic Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 149, - "label": "Named Cargo Price Slot 44", + "label": "Potash Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 150, - "label": "Named Cargo Price Slot 45", + "label": "Pottery Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 151, - "label": "Named Cargo Price Slot 46", + "label": "Prisoners Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 152, - "label": "Named Cargo Price Slot 47", + "label": "Produce Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 153, - "label": "Named Cargo Price Slot 48", + "label": "Pulpwood Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 154, - "label": "Named Cargo Price Slot 49", + "label": "Rice Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 155, - "label": "Named Cargo Price Slot 50", + "label": "Rock Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 156, - "label": "Named Cargo Price Slot 51", + "label": "Rubber Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 157, - "label": "Named Cargo Price Slot 52", + "label": "Salt Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 158, - "label": "Named Cargo Price Slot 53", + "label": "Sand Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 159, - "label": "Named Cargo Price Slot 54", + "label": "Spaceships Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 160, - "label": "Named Cargo Price Slot 55", + "label": "Steel Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 161, - "label": "Named Cargo Price Slot 56", + "label": "Sugar Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 162, - "label": "Named Cargo Price Slot 57", + "label": "Syrup Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 163, - "label": "Named Cargo Price Slot 58", + "label": "Tea Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 164, - "label": "Named Cargo Price Slot 59", + "label": "Tin Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 165, - "label": "Named Cargo Price Slot 60", + "label": "Tires Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 166, - "label": "Named Cargo Price Slot 61", + "label": "Tobacco Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 167, - "label": "Named Cargo Price Slot 62", + "label": "Tools Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 168, - "label": "Named Cargo Price Slot 63", + "label": "Toys Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 169, - "label": "Named Cargo Price Slot 64", + "label": "Troops Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 170, - "label": "Named Cargo Price Slot 65", + "label": "Uranium Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 171, - "label": "Named Cargo Price Slot 66", + "label": "Valuables Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 172, - "label": "Named Cargo Price Slot 67", + "label": "Waste Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 173, - "label": "Named Cargo Price Slot 68", + "label": "Weapons Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 174, - "label": "Named Cargo Price Slot 69", + "label": "Wine Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 175, - "label": "Named Cargo Price Slot 70", + "label": "Wire Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 176, - "label": "Named Cargo Price Slot 71", + "label": "Wool Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "runtime_key": null, - "runtime_status": "evidence_blocked", - "executable_in_runtime": false + "runtime_status": "executable", + "executable_in_runtime": true }, { "descriptor_id": 177, diff --git a/crates/rrt-runtime/src/economy.rs b/crates/rrt-runtime/src/economy.rs index 6e22eb2..e15cdbe 100644 --- a/crates/rrt-runtime/src/economy.rs +++ b/crates/rrt-runtime/src/economy.rs @@ -271,24 +271,42 @@ fn build_cargo_economy_source_report( .collect::>(); let live_registry_entries = build_live_registry_entries(&cargo_types.entries, &cargo_skins.entries); - let production_selector = - cargo_bindings.map(|bindings| build_production_selector(bindings, &live_registry_entries)); - let price_selector_candidate_only_visible_names = production_selector - .as_ref() - .map(|selector| { - let selector_names = selector - .entries - .iter() - .map(|entry| entry.visible_name.as_str()) - .collect::>(); - live_registry_entries - .iter() - .filter(|entry| !selector_names.contains(entry.visible_name.as_str())) - .map(|entry| entry.visible_name.clone()) - .collect::>() + let production_selector = cargo_bindings.and_then(|bindings| { + build_selector_from_bindings( + bindings, + &live_registry_entries, + "cargo_production_named", + "named_cargo_production", + NAMED_CARGO_PRODUCTION_DESCRIPTOR_ROW_COUNT, + "This selector is grounded from the checked-in named cargo production bindings artifact.", + "The current grounded order matches the 50-row named cargo-production descriptor strip.", + ) + }); + let price_selector = cargo_bindings + .and_then(|bindings| { + build_selector_from_bindings( + bindings, + &live_registry_entries, + "cargo_price_named", + "named_cargo_price", + NAMED_CARGO_PRICE_DESCRIPTOR_ROW_COUNT, + "This selector is grounded from the checked-in named cargo price bindings artifact.", + "The current grounded order matches the 71-row named cargo-price descriptor strip.", + ) }) - .unwrap_or_default(); - let price_selector = build_price_selector(&live_registry_entries); + .unwrap_or_else(|| build_price_selector_candidate_registry(&live_registry_entries)); + let price_selector_candidate_only_visible_names = price_selector + .entries + .iter() + .map(|entry| entry.visible_name.as_str()) + .collect::>(); + let price_selector_candidate_only_visible_names = live_registry_entries + .iter() + .filter(|entry| { + !price_selector_candidate_only_visible_names.contains(entry.visible_name.as_str()) + }) + .map(|entry| entry.visible_name.clone()) + .collect::>(); let price_selector_candidate_excess_count = live_registry_entries .len() .saturating_sub(NAMED_CARGO_PRICE_DESCRIPTOR_ROW_COUNT); @@ -302,14 +320,14 @@ fn build_cargo_economy_source_report( "The inspected CargoTypes corpus exposes {} visible names, the inspected cargoSkin corpus exposes {} visible names, and their union exposes {} visible names.", cargo_types.unique_visible_name_count, cargo_skins.unique_visible_name_count, visible_name_union_count )); - if visible_name_union_count != NAMED_CARGO_PRICE_DESCRIPTOR_ROW_COUNT { + if !price_selector.exact_resolution { notes.push( "That visible-name union still does not match the 71-row named cargo-price strip, so this offline source reconstruction is groundwork rather than a complete price-selector binding." .to_string(), ); } else { notes.push( - "The visible-name union matches the 71-row named cargo-price strip; a later pass can decide whether ordering evidence is now strong enough for descriptor bindings." + "The checked-in bindings now close the 71-row named cargo-price strip on top of the merged live cargo registry." .to_string(), ); } @@ -416,15 +434,23 @@ fn build_live_registry_entries( .collect() } -fn build_production_selector( +fn build_selector_from_bindings( bindings: &[CargoBindingRow], live_registry_entries: &[CargoLiveRegistryEntry], -) -> CargoSelectorReport { + band: &str, + selector_kind: &str, + selector_row_count: usize, + grounding_note: &str, + order_note: &str, +) -> Option { let mut rows = bindings .iter() - .filter(|binding| binding.band == "cargo_production_named") + .filter(|binding| binding.band == band) .collect::>(); rows.sort_by_key(|binding| binding.binding_index); + if rows.is_empty() { + return None; + } let entries = rows .into_iter() @@ -440,22 +466,19 @@ fn build_production_selector( }) .collect::>(); - CargoSelectorReport { - selector_kind: "named_cargo_production".to_string(), - exact_resolution: entries.len() == NAMED_CARGO_PRODUCTION_DESCRIPTOR_ROW_COUNT, - selector_row_count: NAMED_CARGO_PRODUCTION_DESCRIPTOR_ROW_COUNT, + Some(CargoSelectorReport { + selector_kind: selector_kind.to_string(), + exact_resolution: entries.len() == selector_row_count, + selector_row_count, candidate_registry_count: live_registry_entries.len(), - notes: vec![ - "This selector is grounded from the checked-in named cargo production bindings artifact." - .to_string(), - "The current grounded order matches the 50-row named cargo-production descriptor strip." - .to_string(), - ], + notes: vec![grounding_note.to_string(), order_note.to_string()], entries, - } + }) } -fn build_price_selector(live_registry_entries: &[CargoLiveRegistryEntry]) -> CargoSelectorReport { +fn build_price_selector_candidate_registry( + live_registry_entries: &[CargoLiveRegistryEntry], +) -> CargoSelectorReport { let entries = live_registry_entries .iter() .enumerate() @@ -768,4 +791,85 @@ mod tests { ); assert_eq!(report.price_selector_candidate_excess_count, 0); } + + #[test] + fn builds_exact_price_selector_from_bindings() { + let cargo_types = CargoTypeInspectionReport { + directory_path: "CargoTypes".to_string(), + entry_count: 2, + unique_visible_name_count: 2, + notes: Vec::new(), + entries: vec![ + CargoTypeEntry { + file_name: "Alcohol.cty".to_string(), + file_size: 16, + file_size_hex: "0x10".to_string(), + header_magic: CARGO_TYPE_MAGIC, + header_magic_hex: format!("0x{CARGO_TYPE_MAGIC:08x}"), + name: parse_cargo_name_token("Alcohol"), + }, + CargoTypeEntry { + file_name: "~4513Rock.cty".to_string(), + file_size: 16, + file_size_hex: "0x10".to_string(), + header_magic: CARGO_TYPE_MAGIC, + header_magic_hex: format!("0x{CARGO_TYPE_MAGIC:08x}"), + name: parse_cargo_name_token("~4513Rock"), + }, + ], + }; + let cargo_skins = CargoSkinInspectionReport { + pk4_path: "Cargo106.PK4".to_string(), + entry_count: 2, + unique_visible_name_count: 2, + notes: Vec::new(), + entries: vec![ + CargoSkinDescriptorEntry { + pk4_entry_name: "Alcohol.dsc".to_string(), + payload_len: 20, + payload_len_hex: "0x14".to_string(), + descriptor_kind: "cargoSkin".to_string(), + name: parse_cargo_name_token("Alcohol"), + }, + CargoSkinDescriptorEntry { + pk4_entry_name: "~4459Beer.dsc".to_string(), + payload_len: 20, + payload_len_hex: "0x14".to_string(), + descriptor_kind: "cargoSkin".to_string(), + name: parse_cargo_name_token("~4459Beer"), + }, + ], + }; + let bindings = vec![ + CargoBindingRow { + descriptor_id: 106, + band: "cargo_price_named".to_string(), + cargo_name: "Alcohol".to_string(), + binding_index: 1, + }, + CargoBindingRow { + descriptor_id: 107, + band: "cargo_price_named".to_string(), + cargo_name: "Beer".to_string(), + binding_index: 2, + }, + CargoBindingRow { + descriptor_id: 108, + band: "cargo_price_named".to_string(), + cargo_name: "Rock".to_string(), + binding_index: 3, + }, + ]; + + let report = build_cargo_economy_source_report(cargo_types, cargo_skins, Some(&bindings)); + assert_eq!(report.price_selector.selector_kind, "named_cargo_price"); + assert!(!report.price_selector.exact_resolution); + assert_eq!(report.price_selector.entries.len(), 3); + assert_eq!(report.price_selector.entries[2].visible_name, "Rock"); + assert_eq!(report.price_selector.entries[2].source_kinds.len(), 1); + assert_eq!( + report.price_selector_candidate_only_visible_names, + Vec::::new() + ); + } } diff --git a/crates/rrt-runtime/src/import.rs b/crates/rrt-runtime/src/import.rs index 7e20114..249656b 100644 --- a/crates/rrt-runtime/src/import.rs +++ b/crates/rrt-runtime/src/import.rs @@ -1463,13 +1463,16 @@ fn lower_contextual_cargo_price_effect( let Some(value) = u32::try_from(row.raw_scalar_value).ok() else { return Ok(None); }; - if row.descriptor_id != 105 { + let target = if row.descriptor_id == 105 { + RuntimeCargoPriceTarget::All + } else if let Some(name) = row.recovered_cargo_label.as_deref() { + RuntimeCargoPriceTarget::Named { + name: name.to_string(), + } + } else { return Ok(None); - } - Ok(Some(RuntimeEffect::SetCargoPriceOverride { - target: RuntimeCargoPriceTarget::All, - value, - })) + }; + Ok(Some(RuntimeEffect::SetCargoPriceOverride { target, value })) } fn lower_contextual_world_scalar_override_effect( @@ -3234,8 +3237,7 @@ fn real_grouped_row_is_unsupported_executable_descriptor_variant( !(row.row_shape == "scalar_assignment" && row.raw_scalar_value >= 0) } Some("cargo_price_scalar") => { - row.descriptor_id == 105 - && !(row.row_shape == "scalar_assignment" && row.raw_scalar_value >= 0) + !(row.row_shape == "scalar_assignment" && row.raw_scalar_value >= 0) } Some("cargo_production_scalar") => { matches!(row.descriptor_id, 177 | 178 | 179 | 230..=240) @@ -4997,12 +4999,22 @@ mod tests { descriptor_id: u32, value: i32, ) -> crate::SmpLoadedPackedEventGroupedEffectRowSummary { - let slot = descriptor_id.saturating_sub(105); + let cargo_label = + crate::smp::grounded_named_cargo_price_label(descriptor_id).map(ToString::to_string); + let descriptor_label = cargo_label + .as_deref() + .map(|label| format!("{label} Price")) + .unwrap_or_else(|| { + format!( + "Named Cargo Price Slot {}", + descriptor_id.saturating_sub(105) + ) + }); crate::SmpLoadedPackedEventGroupedEffectRowSummary { group_index: 0, row_index: 0, descriptor_id, - descriptor_label: Some(format!("Named Cargo Price Slot {slot}")), + descriptor_label: Some(descriptor_label.clone()), target_mask_bits: Some(0x08), parameter_family: Some("cargo_price_scalar".to_string()), grouped_target_subject: None, @@ -5017,10 +5029,10 @@ mod tests { value_word_0x16: 0, row_shape: "scalar_assignment".to_string(), semantic_family: Some("scalar_assignment".to_string()), - semantic_preview: Some(format!("Set Named Cargo Price Slot {slot} to {value}")), + semantic_preview: Some(format!("Set {descriptor_label} to {value}")), recovered_cargo_slot: None, recovered_cargo_class: None, - recovered_cargo_label: None, + recovered_cargo_label: cargo_label, recovered_locomotive_id: None, locomotive_name: None, notes: vec![ @@ -8457,7 +8469,7 @@ mod tests { } #[test] - fn keeps_named_cargo_price_rows_evidence_blocked() { + fn imports_named_cargo_price_rows_when_binding_is_grounded() { let save_slice = SmpLoadedSaveSlice { file_extension_hint: Some("gms".to_string()), container_profile_family: Some("rt3-classic-save-container-v1".to_string()), @@ -8487,13 +8499,13 @@ mod tests { live_record_count: 1, live_entry_ids: vec![39], decoded_record_count: 1, - imported_runtime_record_count: 0, + imported_runtime_record_count: 1, records: vec![crate::SmpLoadedPackedEventRecordSummary { record_index: 0, live_entry_id: 39, payload_offset: Some(0x7202), payload_len: Some(96), - decode_status: "parity_only".to_string(), + decode_status: "executable".to_string(), payload_family: "real_packed_v1".to_string(), trigger_kind: Some(7), active: None, @@ -8507,30 +8519,47 @@ mod tests { grouped_effect_row_counts: vec![1, 0, 0, 0], grouped_effect_rows: vec![real_named_cargo_price_row(106, 140)], decoded_conditions: Vec::new(), - decoded_actions: vec![], - executable_import_ready: false, - notes: vec!["named cargo price descriptors remain evidence-blocked until cargo ordering is pinned" - .to_string()], + decoded_actions: vec![RuntimeEffect::SetCargoPriceOverride { + target: RuntimeCargoPriceTarget::Named { + name: "Alcohol".to_string(), + }, + value: 140, + }], + executable_import_ready: true, + notes: vec![ + "named cargo price descriptors now import through named cargo overrides" + .to_string(), + ], }], }), notes: vec![], }; - let import = project_save_slice_to_runtime_state_import( + let mut import = project_save_slice_to_runtime_state_import( &save_slice, - "packed-events-named-cargo-price-parity", + "packed-events-named-cargo-price-import", None, ) .expect("save slice should project"); - assert!(import.state.event_runtime_records.is_empty()); + assert_eq!(import.state.event_runtime_records.len(), 1); + execute_step_command( + &mut import.state, + &StepCommand::ServiceTriggerKind { trigger_kind: 7 }, + ) + .expect("named cargo price runtime record should run"); + + assert_eq!( + import.state.named_cargo_price_overrides.get("Alcohol"), + Some(&140) + ); assert_eq!( import .state .packed_event_collection .as_ref() .and_then(|summary| summary.records[0].import_outcome.as_deref()), - Some("blocked_evidence_blocked_descriptor") + Some("imported") ); assert_eq!( import @@ -8539,7 +8568,7 @@ mod tests { .as_ref() .and_then(|summary| summary.records[0].grouped_effect_rows.first()) .and_then(|row| row.descriptor_label.as_deref()), - Some("Named Cargo Price Slot 1") + Some("Alcohol Price") ); } diff --git a/crates/rrt-runtime/src/smp.rs b/crates/rrt-runtime/src/smp.rs index 678b2a8..e4f8afb 100644 --- a/crates/rrt-runtime/src/smp.rs +++ b/crates/rrt-runtime/src/smp.rs @@ -3710,6 +3710,14 @@ fn parse_real_grouped_effect_row_summary( "named cargo production descriptor maps to cargo {cargo_label}" )); } + if descriptor_metadata.is_some_and(|metadata| metadata.parameter_family == "cargo_price_scalar") + { + if let Some(cargo_label) = grounded_named_cargo_price_label(descriptor_id) { + notes.push(format!( + "named cargo price descriptor maps to cargo {cargo_label}" + )); + } + } Some(SmpLoadedPackedEventGroupedEffectRowSummary { group_index, @@ -3744,6 +3752,11 @@ fn parse_real_grouped_effect_row_summary( .and_then(known_cargo_slot_definition) .map(|definition| runtime_cargo_class_name(definition.cargo_class).to_string()), recovered_cargo_label: grounded_named_cargo_production_label(descriptor_id) + .or_else(|| { + descriptor_metadata + .filter(|metadata| metadata.parameter_family == "cargo_price_scalar") + .and_then(|_| grounded_named_cargo_price_label(descriptor_id)) + }) .map(ToString::to_string), recovered_locomotive_id: recovered_locomotive_availability_loco_id(descriptor_id) .or_else(|| recovered_locomotive_cost_loco_id(descriptor_id)), @@ -4097,6 +4110,45 @@ const GROUNDED_NAMED_CARGO_PRODUCTION_LABELS: [(&str, &str); 50] = [ ("Wool", "Wool Production"), ]; +#[derive(Debug, Deserialize)] +struct CheckedInCargoBindingsArtifact { + bindings: Vec, +} + +#[derive(Debug, Deserialize)] +struct CheckedInCargoBindingRow { + descriptor_id: u32, + band: String, + cargo_name: String, +} + +fn grounded_named_cargo_price_bindings() -> &'static BTreeMap { + static BINDINGS: OnceLock> = OnceLock::new(); + BINDINGS.get_or_init(|| { + let artifact: CheckedInCargoBindingsArtifact = serde_json::from_str(include_str!( + "../../../artifacts/exports/rt3-1.06/event-effects-cargo-bindings.json" + )) + .expect("checked-in cargo bindings artifact should parse"); + artifact + .bindings + .into_iter() + .filter(|binding| binding.band == "cargo_price_named") + .map(|binding| { + let cargo_name = Box::leak(binding.cargo_name.into_boxed_str()) as &'static str; + let descriptor_label = + Box::leak(format!("{cargo_name} Price").into_boxed_str()) as &'static str; + (binding.descriptor_id, (cargo_name, descriptor_label)) + }) + .collect() + }) +} + +pub(crate) fn grounded_named_cargo_price_label(descriptor_id: u32) -> Option<&'static str> { + grounded_named_cargo_price_bindings() + .get(&descriptor_id) + .map(|(cargo_label, _)| *cargo_label) +} + fn grounded_named_cargo_production_label(descriptor_id: u32) -> Option<&'static str> { let index = descriptor_id.checked_sub(180)? as usize; GROUNDED_NAMED_CARGO_PRODUCTION_LABELS @@ -4830,12 +4882,21 @@ fn decode_real_grouped_effect_action( && descriptor_metadata.parameter_family == "cargo_price_scalar" && row.row_shape == "scalar_assignment" && row.raw_scalar_value >= 0 - && row.descriptor_id == 105 { - return Some(RuntimeEffect::SetCargoPriceOverride { - target: RuntimeCargoPriceTarget::All, - value: row.raw_scalar_value as u32, - }); + return match row.descriptor_id { + 105 => Some(RuntimeEffect::SetCargoPriceOverride { + target: RuntimeCargoPriceTarget::All, + value: row.raw_scalar_value as u32, + }), + descriptor_id => grounded_named_cargo_price_label(descriptor_id).map(|name| { + RuntimeEffect::SetCargoPriceOverride { + target: RuntimeCargoPriceTarget::Named { + name: name.to_string(), + }, + value: row.raw_scalar_value as u32, + } + }), + }; } if descriptor_metadata.executable_in_runtime @@ -12147,11 +12208,11 @@ mod tests { let metadata = real_grouped_effect_descriptor_metadata(106).expect("descriptor metadata should exist"); - assert_eq!(metadata.label, "Named Cargo Price Slot 1"); + assert_eq!(metadata.label, "Alcohol Price"); assert_eq!(metadata.target_mask_bits, 0x08); assert_eq!(metadata.parameter_family, "cargo_price_scalar"); assert_eq!(metadata.runtime_key, None); - assert!(!metadata.executable_in_runtime); + assert!(metadata.executable_in_runtime); } #[test] @@ -12291,7 +12352,7 @@ mod tests { } #[test] - fn parses_named_cargo_price_row_with_stable_slot_label() { + fn parses_grounded_named_cargo_price_row_with_label() { let row_bytes = build_real_grouped_effect_row(RealGroupedEffectRowSpec { descriptor_id: 106, raw_scalar_value: 140, @@ -12309,11 +12370,8 @@ mod tests { .expect("row should parse"); assert_eq!(row.descriptor_id, 106); - assert_eq!( - row.descriptor_label.as_deref(), - Some("Named Cargo Price Slot 1") - ); - assert_eq!(row.recovered_cargo_label, None); + assert_eq!(row.descriptor_label.as_deref(), Some("Alcohol Price")); + assert_eq!(row.recovered_cargo_label.as_deref(), Some("Alcohol")); assert_eq!(row.parameter_family.as_deref(), Some("cargo_price_scalar")); } diff --git a/docs/README.md b/docs/README.md index ef0f119..c5a2cce 100644 --- a/docs/README.md +++ b/docs/README.md @@ -127,20 +127,19 @@ The highest-value next passes are now: `All Cargo Prices` and descriptors `177..179` `All Cargo Production` / `All Factory Production` / `All Farm/Mine Production` land on bounded event-owned cargo override state, and the grounded named cargo-production strip `180..229` now lands on named cargo production overrides too -- the named cargo-price strip `106..176` remains explicit - `blocked_evidence_blocked_descriptor` parity until descriptor ordering is pinned more strongly, - but the checked-in semantic catalog now gives that band stable `Named Cargo Price Slot N` - labels instead of anonymous `Unknown Cargo Price` residue; the checked-in static CargoTypes - corpora also make the current limit explicit because the broader 1.06 corpus has `51` names and - the 1.05 corpus has `41`, while the named price strip still spans `71` descriptors; a new +- the named cargo-price strip `106..176` now lands on named cargo price overrides too; the + checked-in static selector reconstruction is now explicit because the broader 1.06 CargoTypes + corpus has `51` names, the Cargo106 `cargoSkin` corpus has `70`, and the rehosted offline + selector builder now closes the 71-row price strip as `cargoSkin` plus the core `Rock` + carry-over; a new checked-in offline cargo-source report at `artifacts/exports/rt3-1.06/economy-cargo-sources.json` now parses both `CargoTypes` and the `Cargo106.PK4` `cargoSkin` descriptors through rehosted code, normalizes localized - `~####Name` tokens into visible names, builds a merged live cargo registry, and derives an exact - named cargo-production selector from the checked-in bindings; dedicated CLI inspector commands - now expose that production selector and the unresolved price-selector candidate registry - directly, and the same report still shows that the current 1.06 visible-name union is `80`, so - source recovery alone still does not prove the live price-selector ordering + `~####Name` tokens into visible names, builds a merged live cargo registry, and now derives + exact named cargo-production and named cargo-price selectors from the checked-in bindings; + dedicated CLI inspector commands now expose both grounded selectors directly, while the same + report still shows the nine excluded CargoTypes-only industrial names that sit outside the + 71-row price strip - the add-building strip `503..519` is now explicitly classified as recovered shell-owned parity, with tracked fixture coverage, instead of generic unresolved descriptor residue - widen real packed-event executable coverage descriptor by descriptor after identity, target mask, diff --git a/docs/runtime-rehost-plan.md b/docs/runtime-rehost-plan.md index efe63e6..1f984f2 100644 --- a/docs/runtime-rehost-plan.md +++ b/docs/runtime-rehost-plan.md @@ -89,20 +89,18 @@ Implemented today: `All Cargo Prices` and descriptors `177..179` `All Cargo Production` / `All Factory Production` / `All Farm/Mine Production` import through bounded cargo override surfaces, and the grounded named cargo-production strip `180..229` now imports through named cargo production overrides too -- the named cargo-price strip `106..176` now sits on explicit - `blocked_evidence_blocked_descriptor` parity instead of generic unmapped-descriptor frontier; - the checked-in semantic catalog now at least gives that band stable `Named Cargo Price Slot N` - labels instead of anonymous `Unknown Cargo Price` residue, and the checked-in static CargoTypes - corpora now make the evidence gap explicit because they cover `51` names in the broader 1.06 - install and `41` in the 1.05 install while the named price strip still spans `71` descriptors; - a new checked-in offline cargo-source report at +- the named cargo-price strip `106..176` now imports through named cargo price overrides too; the + checked-in static selector reconstruction is now explicit because the broader 1.06 CargoTypes + corpus has `51` names, the Cargo106 `cargoSkin` corpus has `70`, and the rehosted offline + selector builder now closes the 71-row price strip as `cargoSkin` plus the core `Rock` + carry-over; a checked-in offline cargo-source report at `artifacts/exports/rt3-1.06/economy-cargo-sources.json` now parses both `CargoTypes` and the `Cargo106.PK4` `cargoSkin` descriptors through rehosted code, normalizes localized - `~####Name` tokens into visible names, builds a merged live cargo registry, and derives an exact - named cargo-production selector from the checked-in bindings; dedicated CLI inspector commands - now expose that production selector and the unresolved price-selector candidate registry - directly, and the same report still shows that the current 1.06 visible-name union is `80`, so - source recovery alone still does not prove the live price-selector ordering + `~####Name` tokens into visible names, builds a merged live cargo registry, and now derives + exact named cargo-production and named cargo-price selectors from the checked-in bindings; + dedicated CLI inspector commands now expose both grounded selectors directly, while the same + report still shows the nine excluded CargoTypes-only industrial names that sit outside the + 71-row price strip - the add-building strip `503..519` is now explicitly classified as recovered shell-owned parity with tracked fixture coverage, not generic unresolved descriptor residue - a minimal event-owned train surface and an opaque economic-status lane now exist in runtime diff --git a/fixtures/runtime/packed-event-cargo-economics-parity-save-slice-fixture.json b/fixtures/runtime/packed-event-cargo-economics-parity-save-slice-fixture.json index faeeba6..c1cb6f4 100644 --- a/fixtures/runtime/packed-event-cargo-economics-parity-save-slice-fixture.json +++ b/fixtures/runtime/packed-event-cargo-economics-parity-save-slice-fixture.json @@ -3,7 +3,7 @@ "fixture_id": "packed-event-cargo-economics-parity-save-slice-fixture", "source": { "kind": "captured-runtime", - "description": "Fixture pinning the remaining named cargo-price descriptor strip on explicit evidence-blocked parity." + "description": "Fixture pinning the remaining negative named cargo-price variant on explicit variant-blocked parity." }, "state_save_slice_path": "packed-event-cargo-economics-parity-save-slice.json", "commands": [ @@ -18,20 +18,21 @@ "packed_event_record_count": 1, "packed_event_decoded_record_count": 1, "packed_event_imported_runtime_record_count": 0, - "packed_event_blocked_evidence_blocked_descriptor_count": 1, + "packed_event_blocked_evidence_blocked_descriptor_count": 0, "packed_event_blocked_unmapped_real_descriptor_count": 0, "packed_event_blocked_unmapped_world_descriptor_count": 0, - "event_runtime_record_count": 0 + "event_runtime_record_count": 0, + "packed_event_blocked_variant_or_scope_blocked_descriptor_count": 1 }, "expected_state_fragment": { "packed_event_collection": { "records": [ { - "import_outcome": "blocked_evidence_blocked_descriptor", + "import_outcome": "blocked_variant_or_scope_blocked_descriptor", "grouped_effect_rows": [ { "descriptor_id": 106, - "descriptor_label": "Named Cargo Price Slot 1", + "descriptor_label": "Alcohol Price", "parameter_family": "cargo_price_scalar", "semantic_family": "scalar_assignment" } diff --git a/fixtures/runtime/packed-event-cargo-economics-parity-save-slice.json b/fixtures/runtime/packed-event-cargo-economics-parity-save-slice.json index b641380..48b57e0 100644 --- a/fixtures/runtime/packed-event-cargo-economics-parity-save-slice.json +++ b/fixtures/runtime/packed-event-cargo-economics-parity-save-slice.json @@ -2,12 +2,12 @@ "format_version": 1, "save_slice_id": "packed-event-cargo-economics-parity-save-slice", "source": { - "description": "Tracked save-slice document pinning the remaining named cargo-price descriptor strip on explicit evidence-blocked parity.", + "description": "Tracked save-slice document pinning the remaining negative named cargo-price variant on explicit variant-blocked parity.", "original_save_filename": "captured-cargo-economics-parity.gms", "original_save_sha256": "cargo-economics-parity-sample-sha256", "notes": [ "tracked as JSON save-slice document rather than raw .smp", - "pins the named cargo-price strip until exact descriptor-to-cargo ordering is grounded strongly enough" + "pins the negative named cargo-price variant after the positive strip is grounded" ] }, "save_slice": { @@ -37,7 +37,9 @@ "packed_state_version_hex": "0x000003e9", "live_id_bound": 65, "live_record_count": 1, - "live_entry_ids": [65], + "live_entry_ids": [ + 65 + ], "decoded_record_count": 1, "imported_runtime_record_count": 0, "records": [ @@ -57,25 +59,45 @@ "one_shot_header_0x7f5": 0, "modifier_flag_0x7f9": 0, "modifier_flag_0x7fa": 0, - "grouped_target_scope_ordinals_0x7fb": [0, 0, 0, 0], - "grouped_scope_checkboxes_0x7ff": [1, 0, 0, 0], + "grouped_target_scope_ordinals_0x7fb": [ + 0, + 0, + 0, + 0 + ], + "grouped_scope_checkboxes_0x7ff": [ + 1, + 0, + 0, + 0 + ], "summary_toggle_0x800": 1, - "grouped_territory_selectors_0x80f": [-1, -1, -1, -1] + "grouped_territory_selectors_0x80f": [ + -1, + -1, + -1, + -1 + ] }, "text_bands": [], "standalone_condition_row_count": 0, "standalone_condition_rows": [], - "grouped_effect_row_counts": [1, 0, 0, 0], + "grouped_effect_row_counts": [ + 1, + 0, + 0, + 0 + ], "grouped_effect_rows": [ { "group_index": 0, "row_index": 0, "descriptor_id": 106, - "descriptor_label": "Named Cargo Price Slot 1", + "descriptor_label": "Alcohol Price", "target_mask_bits": 8, "parameter_family": "cargo_price_scalar", "opcode": 3, - "raw_scalar_value": 140, + "raw_scalar_value": -1, "value_byte_0x09": 0, "value_dword_0x0d": 0, "value_byte_0x11": 0, @@ -84,27 +106,28 @@ "value_word_0x16": 0, "row_shape": "scalar_assignment", "semantic_family": "scalar_assignment", - "semantic_preview": "Set Named Cargo Price Slot 1 to 140", + "semantic_preview": "Set Alcohol Price to -1", "recovered_cargo_slot": null, "recovered_cargo_class": null, "recovered_locomotive_id": null, "locomotive_name": null, "notes": [ "descriptor recovered from checked-in EventEffects semantic catalog", - "exact named cargo ordering for the price strip is not yet pinned" - ] + "negative named cargo price variants remain parity-only" + ], + "recovered_cargo_label": "Alcohol" } ], "decoded_actions": [], "executable_import_ready": false, "notes": [ - "named cargo-price descriptors remain explicit evidence-blocked parity" + "negative named cargo-price variants remain explicit parity" ] } ] }, "notes": [ - "named cargo price evidence-blocked parity sample" + "negative named cargo price variant parity sample" ] } } diff --git a/fixtures/runtime/packed-event-cargo-economics-save-slice-fixture.json b/fixtures/runtime/packed-event-cargo-economics-save-slice-fixture.json index e32b547..2827b9a 100644 --- a/fixtures/runtime/packed-event-cargo-economics-save-slice-fixture.json +++ b/fixtures/runtime/packed-event-cargo-economics-save-slice-fixture.json @@ -3,7 +3,7 @@ "fixture_id": "packed-event-cargo-economics-save-slice-fixture", "source": { "kind": "captured-runtime", - "description": "Fixture proving the grounded aggregate cargo-economics descriptors plus the grounded named production strip execute through bounded cargo override surfaces." + "description": "Fixture proving the grounded aggregate cargo-economics descriptors plus the grounded named price and production strips execute through bounded cargo override surfaces." }, "state_save_slice_path": "packed-event-cargo-economics-save-slice.json", "commands": [ @@ -50,6 +50,14 @@ }, "value": 180 }, + { + "kind": "set_cargo_price_override", + "target": { + "kind": "named", + "name": "Alcohol" + }, + "value": 140 + }, { "kind": "set_cargo_production_override", "target": { @@ -81,6 +89,9 @@ } ] } - ] + ], + "named_cargo_price_overrides": { + "Alcohol": 140 + } } } diff --git a/fixtures/runtime/packed-event-cargo-economics-save-slice.json b/fixtures/runtime/packed-event-cargo-economics-save-slice.json index 78da771..14ed51e 100644 --- a/fixtures/runtime/packed-event-cargo-economics-save-slice.json +++ b/fixtures/runtime/packed-event-cargo-economics-save-slice.json @@ -2,12 +2,12 @@ "format_version": 1, "save_slice_id": "packed-event-cargo-economics-save-slice", "source": { - "description": "Tracked save-slice document proving the grounded aggregate and named-production cargo-economics descriptors execute through bounded cargo override surfaces.", + "description": "Tracked save-slice document proving the grounded aggregate, named-price, and named-production cargo-economics descriptors execute through bounded cargo override surfaces.", "original_save_filename": "captured-cargo-economics.gms", "original_save_sha256": "cargo-economics-sample-sha256", "notes": [ "tracked as JSON save-slice document rather than raw .smp", - "pins the grounded aggregate descriptors 105 and 177..179 plus the grounded named production strip 180..229 while named cargo price remains evidence-blocked" + "pins the grounded descriptors 105..179 plus named cargo price 106..176 and named cargo production 180..229" ] }, "save_slice": { @@ -37,9 +37,11 @@ "packed_state_version_hex": "0x000003e9", "live_id_bound": 64, "live_record_count": 1, - "live_entry_ids": [64], + "live_entry_ids": [ + 64 + ], "decoded_record_count": 1, - "imported_runtime_record_count": 0, + "imported_runtime_record_count": 1, "records": [ { "record_index": 0, @@ -57,15 +59,35 @@ "one_shot_header_0x7f5": 0, "modifier_flag_0x7f9": 0, "modifier_flag_0x7fa": 0, - "grouped_target_scope_ordinals_0x7fb": [0, 0, 0, 0], - "grouped_scope_checkboxes_0x7ff": [1, 0, 0, 0], + "grouped_target_scope_ordinals_0x7fb": [ + 0, + 0, + 0, + 0 + ], + "grouped_scope_checkboxes_0x7ff": [ + 1, + 0, + 0, + 0 + ], "summary_toggle_0x800": 1, - "grouped_territory_selectors_0x80f": [-1, -1, -1, -1] + "grouped_territory_selectors_0x80f": [ + -1, + -1, + -1, + -1 + ] }, "text_bands": [], "standalone_condition_row_count": 0, "standalone_condition_rows": [], - "grouped_effect_row_counts": [5, 0, 0, 0], + "grouped_effect_row_counts": [ + 6, + 0, + 0, + 0 + ], "grouped_effect_rows": [ { "group_index": 0, @@ -96,6 +118,34 @@ { "group_index": 0, "row_index": 1, + "descriptor_id": 106, + "descriptor_label": "Alcohol Price", + "target_mask_bits": 8, + "parameter_family": "cargo_price_scalar", + "opcode": 3, + "raw_scalar_value": 140, + "value_byte_0x09": 0, + "value_dword_0x0d": 0, + "value_byte_0x11": 0, + "value_byte_0x12": 0, + "value_word_0x14": 0, + "value_word_0x16": 0, + "row_shape": "scalar_assignment", + "semantic_family": "scalar_assignment", + "semantic_preview": "Set Alcohol Price to 140", + "recovered_cargo_slot": null, + "recovered_cargo_class": null, + "recovered_cargo_label": "Alcohol", + "recovered_locomotive_id": null, + "locomotive_name": null, + "notes": [ + "descriptor recovered from checked-in EventEffects semantic catalog", + "named cargo price descriptor maps to cargo Alcohol" + ] + }, + { + "group_index": 0, + "row_index": 2, "descriptor_id": 177, "descriptor_label": "All Cargo Production", "target_mask_bits": 8, @@ -121,7 +171,7 @@ }, { "group_index": 0, - "row_index": 2, + "row_index": 3, "descriptor_id": 178, "descriptor_label": "All Factory Production", "target_mask_bits": 8, @@ -147,7 +197,7 @@ }, { "group_index": 0, - "row_index": 3, + "row_index": 4, "descriptor_id": 179, "descriptor_label": "All Farm/Mine Production", "target_mask_bits": 8, @@ -173,7 +223,7 @@ }, { "group_index": 0, - "row_index": 4, + "row_index": 5, "descriptor_id": 180, "descriptor_label": "Alcohol Production", "target_mask_bits": 8, @@ -208,6 +258,14 @@ }, "value": 180 }, + { + "kind": "set_cargo_price_override", + "target": { + "kind": "named", + "name": "Alcohol" + }, + "value": 140 + }, { "kind": "set_cargo_production_override", "target": { @@ -240,8 +298,9 @@ ], "executable_import_ready": true, "notes": [ - "grounded aggregate cargo economics descriptors plus the grounded named production strip execute through bounded cargo override surfaces" - ] + "aggregate and named cargo-economics descriptors now import through bounded cargo overrides" + ], + "imported_runtime_record_count": 1 } ] },