diff --git a/CMakeLists.txt b/CMakeLists.txt index 009d5301..79ae2132 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -186,7 +186,7 @@ endif () set(CMAKE_CXX_STANDARD 20) option(HIGHBAR_STOCK_RECOIL - "Build the stock Recoil 2025.06.19 tactical profile without appended callbacks" OFF) + "Build the stock Recoil 2026.07.04 tactical profile without appended callbacks" OFF) if (HIGHBAR_STOCK_RECOIL AND HIGHBAR_FACTORY_REPLACEMENT_V1) message(FATAL_ERROR "HIGHBAR_STOCK_RECOIL cannot be combined with the custom factory replacement extension") @@ -342,9 +342,9 @@ if (BUILD_Cpp_AIWRAPPER) string(REGEX MATCH "sha256[ \t]*=[ \t]*\"([^\"]+)\"" _ "${_highbar_pin_content}") set(HIGHBAR_ENGINE_SHA256 "${CMAKE_MATCH_1}") if (HIGHBAR_STOCK_RECOIL) - set(HIGHBAR_ENGINE_RELEASE_ID "2025.06.19") + set(HIGHBAR_ENGINE_RELEASE_ID "2026.07.04") set(HIGHBAR_ENGINE_SHA256 - "e4f63c1a391f9ddfbb4d1da225d9533b1d56c65133687d036422a7380c84e833") + "651d6dca67ad99fde1a593d57eede0dfee167e200558988f154ad2bac1cfce21") endif () if (NOT HIGHBAR_ENGINE_RELEASE_ID OR NOT HIGHBAR_ENGINE_SHA256) message(FATAL_ERROR diff --git a/contracts/barc-stock-queue-v1/contract.json b/contracts/barc-stock-queue-v1/contract.json index ccf5c2be..b34f4b37 100644 --- a/contracts/barc-stock-queue-v1/contract.json +++ b/contracts/barc-stock-queue-v1/contract.json @@ -3,9 +3,9 @@ "owner": "FS-GG/HighBarV3", "consumer": "FS-GG/FSBarV2", "stockEngine": { - "sourceCommit": "2639eedac7d1fd67d793ec93ebd27f014f336a14", - "headlessSha256": "e4f63c1a391f9ddfbb4d1da225d9533b1d56c65133687d036422a7380c84e833", - "release": "2025.06.19" + "sourceCommit": "de69361239d8c8b1012dba3f5aa3122954ea4da3", + "headlessSha256": "651d6dca67ad99fde1a593d57eede0dfee167e200558988f154ad2bac1cfce21", + "release": "2026.07.04" }, "profiles": { "legacy": { diff --git a/data/config/spring-headless.pin b/data/config/spring-headless.pin index d5c20066..f75652d0 100644 --- a/data/config/spring-headless.pin +++ b/data/config/spring-headless.pin @@ -1,5 +1,5 @@ [engine] -release_id = "recoil_2025.06.19" -sha256 = "e4f63c1a391f9ddfbb4d1da225d9533b1d56c65133687d036422a7380c84e833" -acquisition_url = "https://github.com/beyond-all-reason/RecoilEngine/releases/download/2025.06.19/recoil_2025.06.19_amd64-linux.7z" -install_path_relative = "Beyond All Reason/engine/recoil_2025.06.19" +release_id = "recoil_2026.07.04" +sha256 = "651d6dca67ad99fde1a593d57eede0dfee167e200558988f154ad2bac1cfce21" +acquisition_url = "https://github.com/beyond-all-reason/RecoilEngine/releases/download/2026.07.04/recoil_2026.07.04_amd64-linux.7z" +install_path_relative = "Beyond All Reason/engine/recoil_2026.07.04" diff --git a/docs/compilation.md b/docs/compilation.md index b4af21ce..d10efe83 100644 --- a/docs/compilation.md +++ b/docs/compilation.md @@ -49,13 +49,13 @@ setting up a new machine. The practical requirements are: The currently pinned runtime is: ```text -recoil_2025.06.19 +recoil_2026.07.04 ``` The reference engine binary path used by the test harness is: ```text -$HOME/.local/state/Beyond All Reason/engine/recoil_2025.06.19/spring-headless +$HOME/.local/state/Beyond All Reason/engine/recoil_2026.07.04/spring-headless ``` ## Source Layout @@ -184,7 +184,7 @@ make test The runtime install directory is: ```text -$BAR_DATA/engine/recoil_2025.06.19/AI/Skirmish/highBar/stable/ +$BAR_DATA/engine/recoil_2026.07.04/AI/Skirmish/highBar/stable/ ``` On the reference Linux setup, `$BAR_DATA` is: @@ -207,7 +207,7 @@ Example: ```bash BAR_DATA="$HOME/.local/state/Beyond All Reason" -ENGINE_RELEASE="recoil_2025.06.19" +ENGINE_RELEASE="recoil_2026.07.04" HIGHBAR_DIR="$BAR_DATA/engine/$ENGINE_RELEASE/AI/Skirmish/highBar/stable" mkdir -p "$HIGHBAR_DIR/config" "$HIGHBAR_DIR/script" diff --git a/docs/local-env.md b/docs/local-env.md index 12d153dd..38673b54 100644 --- a/docs/local-env.md +++ b/docs/local-env.md @@ -2,7 +2,7 @@ ## Spring Headless -- `SPRING_HEADLESS=/home/developer/.local/state/Beyond All Reason/engine/recoil_2025.06.19/spring-headless` +- `SPRING_HEADLESS=/home/developer/.local/state/Beyond All Reason/engine/recoil_2026.07.04/spring-headless` - Persisted for login shells in `/home/developer/.bash_profile` ## BAR Graphical Client diff --git a/docs/roadmaps/barc-01-native-asset-proof.md b/docs/roadmaps/barc-01-native-asset-proof.md index 3ad9b41f..31c5836d 100644 --- a/docs/roadmaps/barc-01-native-asset-proof.md +++ b/docs/roadmaps/barc-01-native-asset-proof.md @@ -1,5 +1,31 @@ # BARC-01 native asset and correlated result proof +## Selected current stock engine — 2026-10-02 + +The next product candidate uses the official Recoil **2026.07.04** release, +source `de69361239d8c8b1012dba3f5aa3122954ea4da3`, tree +`081bfe95b4e76e3212afa5805ab5a82e474c0b47`. Downloaded amd64 Linux archive +SHA-256 is `9824c2c38124e4b90a9b5f7c4e7200c3ea6503c0bd4bff0e0ff46212ec29dcab`, +matching GitHub's published asset digest. Extracted headless SHA-256 is +`651d6dca67ad99fde1a593d57eede0dfee167e200558988f154ad2bac1cfce21`; +actual version readback is `spring-headless version 2026.07.04 (Headless)`. + +The selected stock build pin, generated engine identity, closed release-tuple +admission, trace admission and producer/consumer contract agree on this release. +The Lua observer's exact source check follows the new source; wire revision, +queue behavior and historical algorithm vectors are unchanged. The older +profile's release tuple is refused by the new stock admission. + +The official engine remains unmodified. Its +[upstream headless atlas guard](https://github.com/beyond-all-reason/RecoilEngine/blob/de69361239d8c8b1012dba3f5aa3122954ea4da3/rts/Rendering/Textures/TextureRenderAtlas.cpp#L389) +is a source-grounded repair candidate, with local startup effect still unproved. +Existing runtime/evidence directories were preserved; the new engine is acquired +in a separate candidate installation. Plugin build checks are recorded with the +owning PR. Count1 and all six useful-play journeys remain unaccepted. + +The remaining sections retain the historical 2025.06.19 asset proof and its +attempt-scoped identities. They do not describe the new candidate's acceptance. + This records a reproducible local asset set and the limit of native evidence as of 2026-09-28. It proves one live MoveUnit engine effect but does not qualify the full BARC-01.2 command/result contract. diff --git a/scripts/build-barc-stock-plugin.sh b/scripts/build-barc-stock-plugin.sh index 946a4f4d..f8cee8c3 100755 --- a/scripts/build-barc-stock-plugin.sh +++ b/scripts/build-barc-stock-plugin.sh @@ -9,9 +9,9 @@ fi recoil_source=$(realpath "$1") highbar_source=$(realpath "$2") build_dir=$(realpath -m "$3") -expected_recoil_commit=2639eedac7d1fd67d793ec93ebd27f014f336a14 -expected_recoil_tree=94c1d8ad62b20285b19c1b5f3360a81fbbc54468 -expected_contract_sha=28afbc6703843a617db5e3f59a5fcf55a671c993f0585766f1ab2f71218333dc +expected_recoil_commit=de69361239d8c8b1012dba3f5aa3122954ea4da3 +expected_recoil_tree=081bfe95b4e76e3212afa5805ab5a82e474c0b47 +expected_contract_sha=ac0c94390a1b5da600e49e2d00d9a36d4782964a33603ddbc2c4bafbd3db8c28 cmake_bin=${BARC_CMAKE_BIN:-cmake} sysroot=${BARC_SYSROOT:-/tmp/barc-native-assets/sysroot/usr} jobs=${BARC_BUILD_JOBS:-4} @@ -22,7 +22,7 @@ if (( jobs < 1 || jobs > 8 )); then fi if [[ $(git -C "${recoil_source}" rev-parse HEAD) != "${expected_recoil_commit}" \ || $(git -C "${recoil_source}" rev-parse HEAD^{tree}) != "${expected_recoil_tree}" ]]; then - echo "Recoil source is not the admitted stock 2639 commit/tree" >&2 + echo "Recoil source is not the admitted stock 2026.07.04 commit/tree" >&2 exit 1 fi if [[ -n $(git -C "${recoil_source}" status --porcelain --untracked-files=no --ignore-submodules=all) ]]; then diff --git a/src/circuit/grpc/StockQueueTrace.cpp b/src/circuit/grpc/StockQueueTrace.cpp index c2f59a56..04f7dfc8 100644 --- a/src/circuit/grpc/StockQueueTrace.cpp +++ b/src/circuit/grpc/StockQueueTrace.cpp @@ -151,7 +151,7 @@ bool Valid(const StockQueueTraceRecord& r) { if (c.profile != kStockTacticalProfile || c.revision != kStockTacticalRevision || c.evidence_scheme != QueueEvidenceScheme::StockLuaSupportedFieldsV1 || c.catalogue_id.size() != 16 || c.catalogue_revision == 0 - || c.engine_version != "2025.06.19" || !BoundedText(c.game_name) + || c.engine_version != "2026.07.04" || !BoundedText(c.game_name) || !BoundedText(c.game_version) || c.game_content_sha256.size() != 32 || c.actor_id > 31999 || c.actor_lifetime == 0 || (c.domain != "production" && c.domain != "rally")) return false; diff --git a/src/circuit/grpc/TacticalNativeState.cpp b/src/circuit/grpc/TacticalNativeState.cpp index 0a9ab86b..1bea4fae 100644 --- a/src/circuit/grpc/TacticalNativeState.cpp +++ b/src/circuit/grpc/TacticalNativeState.cpp @@ -221,14 +221,14 @@ bool SupportsStockRecoilProfile(const char* major, const char* minor, && additional != nullptr && normal != nullptr && sync != nullptr && full != nullptr && is_release - && std::strcmp(major, "2025") == 0 - && std::strcmp(minor, "06") == 0 - && std::strcmp(patchset, "19") == 0 + && std::strcmp(major, "2026") == 0 + && std::strcmp(minor, "07") == 0 + && std::strcmp(patchset, "04") == 0 && commits[0] == '\0' && hash[0] == '\0' && branch[0] == '\0' && std::strcmp(additional, "Headless") == 0 - && std::strcmp(normal, "2025.06.19") == 0 - && std::strcmp(sync, "2025.06.19") == 0 - && std::strcmp(full, "2025.06.19 (Headless)") == 0; + && std::strcmp(normal, "2026.07.04") == 0 + && std::strcmp(sync, "2026.07.04") == 0 + && std::strcmp(full, "2026.07.04 (Headless)") == 0; } std::optional NativeBuildDefinitionId( diff --git a/tests/stock-observer/run_stock_lua51_float_abi.py b/tests/stock-observer/run_stock_lua51_float_abi.py index 04bbafde..a63f1cff 100755 --- a/tests/stock-observer/run_stock_lua51_float_abi.py +++ b/tests/stock-observer/run_stock_lua51_float_abi.py @@ -10,7 +10,7 @@ import subprocess import tempfile -EXPECTED_RECOIL = "2639eedac7d1fd67d793ec93ebd27f014f336a14" +EXPECTED_RECOIL = "de69361239d8c8b1012dba3f5aa3122954ea4da3" ROOT = pathlib.Path(__file__).resolve().parents[2] diff --git a/tests/unit/stock_queue_trace_test.cc b/tests/unit/stock_queue_trace_test.cc index 992882d9..8ee9d7b5 100644 --- a/tests/unit/stock_queue_trace_test.cc +++ b/tests/unit/stock_queue_trace_test.cc @@ -56,7 +56,7 @@ StockQueueTraceRecord Record(bool final_read = false) { value.context.profile = kStockTacticalProfile; value.context.revision = kStockTacticalRevision; value.context.evidence_scheme = QueueEvidenceScheme::StockLuaSupportedFieldsV1; value.context.catalogue_id = std::string(16, 'c'); value.context.catalogue_revision = 8; - value.context.engine_version = "2025.06.19"; value.context.game_name = "BAR"; + value.context.engine_version = "2026.07.04"; value.context.game_name = "BAR"; value.context.game_version = "test"; value.context.game_content_sha256 = std::string(32, 'h'); value.context.actor_id = 0; value.context.actor_lifetime = 7; value.context.domain = "production"; value.read.status = StockQueueReadStatus::Complete; value.read.domain = StockQueueDomain::Production; @@ -98,6 +98,16 @@ TEST(StockQueueTrace, WritesClosedSampleAndFinalIdentityWithSignedZeroBits) { ::close(fd); ::unlink(path); } +TEST(StockQueueTrace, RefusesHistoricalEngineIdentity) { + char path[] = "/tmp/highbar-stock-engine-test-XXXXXX"; + const int fd = ::mkstemp(path); ASSERT_GE(fd, 0); + auto sink = StockQueueTraceSink::CreateForTest(fd, "run"); ASSERT_TRUE(sink); + auto record = Record(); record.context.engine_version = "2025.06.19"; + record.computed_revision = ComputeStockQueueRevision(record.context, record.read.entries); + EXPECT_FALSE(sink->Record(record)); EXPECT_EQ(sink->records_written(), 0u); + sink.reset(); ::unlink(path); +} + TEST(StockQueueTrace, PartialWritesCompleteButZeroWriteLatchesFailure) { char path[] = "/tmp/highbar-stock-trace-write-XXXXXX"; const int fd = ::mkstemp(path); ASSERT_GE(fd, 0); auto partial = StockQueueTraceSink::CreateForTest(fd, "run", [](int descriptor, const void* data, std::size_t size) { diff --git a/tests/unit/tactical_native_state_test.cc b/tests/unit/tactical_native_state_test.cc index ab4bdff8..b009e10f 100644 --- a/tests/unit/tactical_native_state_test.cc +++ b/tests/unit/tactical_native_state_test.cc @@ -128,20 +128,22 @@ TEST(TacticalNativeState, StockProfileRequiresClosedReleaseTuple) { return SupportsStockRecoilProfile(major, minor, patchset, "", hash, branch, additional, normal, sync, full, is_release); }; - EXPECT_TRUE(supports("2025", "06", "19", "", "", "Headless", + EXPECT_TRUE(supports("2026", "07", "04", "", "", "Headless", + "2026.07.04", "2026.07.04", "2026.07.04 (Headless)")); + EXPECT_FALSE(supports("2025", "06", "19", "", "", "Headless", "2025.06.19", "2025.06.19", "2025.06.19 (Headless)")); EXPECT_FALSE(supports("2025", "06", "20", "", "", "Headless", "2025.06.20", "2025.06.20", "2025.06.20 (Headless)")); - EXPECT_FALSE(supports("2025", "06", "19", "", "", "", - "2025.06.19", "2025.06.19", "2025.06.19")); - EXPECT_FALSE(supports("2025", "06", "19", "", "", "Headless Debug", - "2025.06.19", "2025.06.19", "2025.06.19 (Headless Debug)")); - EXPECT_FALSE(supports("2025", "06", "19", "custom", "", "Headless", - "2025.06.19", "2025.06.19", "2025.06.19 (Headless)")); - EXPECT_FALSE(supports("2025", "06", "19", "", "", "Headless", - "2025.06.19", "2025.06.19", "2025.06.19 (Headless)", false)); - EXPECT_FALSE(supports(nullptr, "06", "19", "", "", "Headless", - "2025.06.19", "2025.06.19", "2025.06.19 (Headless)")); + EXPECT_FALSE(supports("2026", "07", "04", "", "", "", + "2026.07.04", "2026.07.04", "2026.07.04")); + EXPECT_FALSE(supports("2026", "07", "04", "", "", "Headless Debug", + "2026.07.04", "2026.07.04", "2026.07.04 (Headless Debug)")); + EXPECT_FALSE(supports("2026", "07", "04", "custom", "", "Headless", + "2026.07.04", "2026.07.04", "2026.07.04 (Headless)")); + EXPECT_FALSE(supports("2026", "07", "04", "", "", "Headless", + "2026.07.04", "2026.07.04", "2026.07.04 (Headless)", false)); + EXPECT_FALSE(supports(nullptr, "07", "04", "", "", "Headless", + "2026.07.04", "2026.07.04", "2026.07.04 (Headless)")); } TEST(TacticalNativeState, BuildDefinitionProjectionCoversSignedMinimum) {