From c6502724fd847ed3150675a19c23f40fb2cfd0df Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 27 Mar 2026 17:26:48 +0100 Subject: [PATCH 1/5] Add unit test for #737 --- core/test/test_fallback.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/test/test_fallback.cpp b/core/test/test_fallback.cpp index c5b7eb90b..35134d05a 100644 --- a/core/test/test_fallback.cpp +++ b/core/test/test_fallback.cpp @@ -195,3 +195,19 @@ TEST_F(FallbacksFixtureConnect, connectStageInsideFallbacks) { EXPECT_TRUE(t.plan()); EXPECT_COSTS(t.solutions(), testing::ElementsAre(11, 12, 22, 121)); } + +TEST_F(FallbacksFixtureConnect, connectInsideSerialInsideFallbacks) { + t.add(std::make_unique(PredefinedCosts({ 0.0 }))); + auto fallbacks = std::make_unique("Fallbacks"); + auto serial = std::make_unique("Serial1"); + serial->add(std::make_unique(PredefinedCosts::constant(0.0))); + serial->add(std::make_unique(PredefinedCosts::constant(1.0))); + serial->add(std::make_unique(PredefinedCosts::constant(INF))); + serial->add(std::make_unique(PredefinedCosts::single(2.0))); + fallbacks->add(std::move(serial)); + fallbacks->add(std::make_unique(PredefinedCosts::constant(4.0))); + + t.add(std::move(fallbacks)); + EXPECT_TRUE(t.plan()); + EXPECT_COSTS(t.solutions(), testing::ElementsAre(4.0)); +} From 82a1156ea4518ec0021432d24b0b39826b322700 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Fri, 27 Mar 2026 17:27:24 +0100 Subject: [PATCH 2/5] Consider pruning property in Connect stage Even if pruning was disabled, pruning could sneak in via the Connect stage. --- core/src/stage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/stage.cpp b/core/src/stage.cpp index 8b37752e4..5d23dc479 100644 --- a/core/src/stage.cpp +++ b/core/src/stage.cpp @@ -820,7 +820,7 @@ void ConnectingPrivate::newState(Interface::iterator it, Interface::UpdateFlags for (Interface::iterator oit : oit_to_enable) parent_pimpl->setStatus()>(me(), &*it, &*oit, InterfaceState::Status::ENABLED); - if (!have_enabled_opposites) // prune new state and associated branch if necessary + if (!have_enabled_opposites && parent()->pruning()) // prune new state and associated branch if necessary // pass creator=nullptr to skip hasPendingOpposites() check as we did this here already parent_pimpl->setStatus(nullptr, nullptr, &*it, InterfaceState::Status::ARMED); } From 98bd8c08676f3f5b56b5845e1d93ca97fd937a56 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Sat, 28 Mar 2026 11:28:11 +0100 Subject: [PATCH 3/5] Shift definition of pruning property's default Previously, it was explicitly disabled in Task's constructor. Child containers inherited the setting from their parent, i.e. ultimately the task. However, this meant that the property remained undefined for standalone containers. Now, the default value is declared in each container. Additionally, the property is still inherited from the parent. --- core/src/container.cpp | 2 +- core/src/task.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/container.cpp b/core/src/container.cpp index fa60a2ece..9cba53522 100644 --- a/core/src/container.cpp +++ b/core/src/container.cpp @@ -327,7 +327,7 @@ void ContainerBasePrivate::liftSolution(const SolutionBasePtr& solution, const I ContainerBase::ContainerBase(ContainerBasePrivate* impl) : Stage(impl) { auto& p = properties(); - p.declare("pruning", std::string("enable pruning?")).configureInitFrom(Stage::PARENT, "pruning"); + p.declare("pruning", false, std::string("enable pruning?")).configureInitFrom(Stage::PARENT, "pruning"); } size_t ContainerBase::numChildren() const { diff --git a/core/src/task.cpp b/core/src/task.cpp index 221bb6aca..7d654239e 100644 --- a/core/src/task.cpp +++ b/core/src/task.cpp @@ -94,7 +94,6 @@ const ContainerBase* TaskPrivate::stages() const { Task::Task(const std::string& ns, bool introspection, ContainerBase::pointer&& container) : WrapperBase(new TaskPrivate(this, ns), std::move(container)) { - setPruning(false); setTimeout(std::numeric_limits::max()); // monitor state on commandline From ac418eb80ea130bf93d3c28ab8c162e4f5daaa2f Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Sat, 28 Mar 2026 12:18:44 +0100 Subject: [PATCH 4/5] Reenable state before passing it to Fallbacks child --- core/src/container.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/src/container.cpp b/core/src/container.cpp index 9cba53522..4543ef059 100644 --- a/core/src/container.cpp +++ b/core/src/container.cpp @@ -1029,6 +1029,11 @@ bool FallbacksPrivatePropagator::nextJob() { } // When arriving here, we have a valid job_ and a current_ child to feed it. Let's do that. + if (dir_ == Interface::FORWARD) + setStatus(nullptr, nullptr, &*job_, InterfaceState::Status::ENABLED); + else + setStatus(nullptr, nullptr, &*job_, InterfaceState::Status::ENABLED); + copyState(dir_, job_, (*current_)->pimpl()->pullInterface(dir_), Interface::UpdateFlags()); return true; } From 666e7f349e5b700aa6475989f69cec33f585ff49 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Sat, 28 Mar 2026 11:53:38 +0100 Subject: [PATCH 5/5] CI: Update GitHub Actions --- .github/workflows/ci.yaml | 12 ++++++------ .github/workflows/format.yaml | 2 +- .github/workflows/prerelease.yaml | 2 +- .pre-commit-config.yaml | 4 ++-- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8d1e90bfb..57b9a4ae2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -53,7 +53,7 @@ jobs: name: "${{ matrix.env.IMAGE }}${{ matrix.env.NAME && ' • ' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CATKIN_LINT && ' • catkin_lint' || ''}}${{ matrix.env.CLANG_TIDY && ' • clang-tidy' || '' }}" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive @@ -80,14 +80,14 @@ jobs: subdir: target_ws/install - name: Upload test artifacts (on failure) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: failure() && (steps.ici.outputs.run_target_test || steps.ici.outputs.target_test_results) with: name: test-results-${{ matrix.env.IMAGE }}${{ matrix.env.NAME && '-' || ''}}${{ matrix.env.NAME }}${{ matrix.env.CLANG_TIDY && '-clang-tidy' || '' }} path: ${{ env.BASEDIR }}/target_ws/**/test_results/**/*.xml - name: Upload clang-tidy fixes (on failure) - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: failure() && steps.ici.outputs.clang_tidy_checks with: name: clang-tidy-fixes.yaml @@ -122,9 +122,9 @@ jobs: image: moveit/moveit:jammy-ci steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Pages - uses: actions/configure-pages@v5 + uses: actions/configure-pages@v6 - name: Install dependencies run: | @@ -149,7 +149,7 @@ jobs: sphinx-build -W -b linkcheck core/doc _site - name: Upload pages artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v4 # Deployment job deploy: diff --git a/.github/workflows/format.yaml b/.github/workflows/format.yaml index 33d3a8a6e..e5ee78252 100644 --- a/.github/workflows/format.yaml +++ b/.github/workflows/format.yaml @@ -13,7 +13,7 @@ jobs: name: pre-commit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive - name: Install clang-format-14 diff --git a/.github/workflows/prerelease.yaml b/.github/workflows/prerelease.yaml index 18c6c0a13..900db7253 100644 --- a/.github/workflows/prerelease.yaml +++ b/.github/workflows/prerelease.yaml @@ -34,7 +34,7 @@ jobs: # free up a lot of stuff from /usr/local sudo rm -rf /usr/local df -h - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: submodules: recursive - name: industrial_ci diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 55effc06f..95e1c8531 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,7 @@ repos: # Standard hooks - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v5.0.0 + rev: v6.0.0 hooks: - id: check-added-large-files - id: check-case-conflict @@ -29,7 +29,7 @@ repos: - id: trailing-whitespace - repo: https://github.com/psf/black - rev: 25.1.0 + rev: 26.3.1 hooks: - id: black args: ["--line-length", "100"]