Repository: OpenAssetIO/OpenAssetIO (language: python)

Issue:
Decide on `const` vs. `non-const` member functions
# What

Go through existing C++ implementation and decide if member functions and/or their parameters should be `const`.

# Why

Using `const` member functions wherever possible is good practice. However, it is obviously constraining. This is especially true for an abstract interface, where the underlying (host/plugin) implementation might want to mutate some internal state.

Similarly, `const` function arguments are good practice where possible. However, again we must be careful in assuming that mutation (including non-`const` member function calls) will never be required.

# Notes

One heuristic worth considering is "should this function be super cheap?" - enforcing `const`ness is a way to signal this.

Another consideration is whether and where an object is expected to be passed as a `const` value/reference, meaning only the `const` subset of member functions can be called.

Perhaps worth considering [`std::experimental::propagate_const`](https://en.cppreference.com/w/cpp/experimental/propagate_const), depending on compiler support.

## ACs

- `ManagerInterface`: only `identifier` `displayName`  and `createEntityReference` remain const.
- `Manager` should mirror the interface
- `Host` + interface follows suit


Discussion / hints:

Fix patch:
diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md
index 420684df2..4837e34ba 100644
--- a/RELEASE_NOTES.md
+++ b/RELEASE_NOTES.md
@@ -17,6 +17,10 @@ v1.0.0-alpha.xx
   private dependency.
   [#1070](https://github.com/OpenAssetIO/OpenAssetIO/issues/1070)
 
+- Removed `const` from the majority of interface methods to allow
+  implementations to make use of private state for efficiency reasons.
+  [#518](https://github.com/OpenAssetIO/OpenAssetIO/issues/518)
+
 v1.0.0-alpha.14
 ---------------
 
diff --git a/doc/contributing/CODING_STANDARDS.md b/doc/contributing/CODING_STANDARDS.md
index 1bad483f3..4355dca54 100644
--- a/doc/contributing/CODING_STANDARDS.md
+++ b/doc/contributing/CODING_STANDARDS.md
@@ -176,6 +176,16 @@ when binding a C++ `enum class` using pybind, use
 namespaced in the same way as in C++, i.e. not polluting the parent
 namespace.
 
+### Const
+
+Methods of interface classes that are conceptually stateless, and their
+corresponding wrapper class methods should not be marked `const`. For
+example, `ManagerInterface` + `Manager`, `HostInterface` and `Host`.
+This may seem to contradict the "stateless" definition, but it allows
+the implementation to maintain private state to service the API requests
+efficiently, such as server connections or caches. Exceptions to this
+are the identification methods that should be constants.
+
 ## String formatting
 
 The project has a (private, header-only) dependency on the
@@ -236,6 +246,7 @@ This causes problems in particular when we use Pybind "trampoline"
 classes to call a Python method override from a C++ virtual member
 function. For example, if the Python instance is destroyed, then in the
 case of pure virtual member functions, `pybind` may throw an exception
+
 ```
 RuntimeError: Tried to call pure virtual function
 ```
@@ -257,19 +268,23 @@ be kept alive) in `Args` to instead be `PyRetainingSharedPtr` types.
 To handle instances returned from a Python method to C++ we must modify
 the `PYBIND11_OVERRIDE` macro arguments in the Pybind "trampoline" class
 member functions from, for example
+
 ```c++
 std::shared_ptr<MyReturnType> PyMyClass::myMethod(myArg) override {
   PYBIND11_OVERRIDE(
       std::shared_ptr<MyReturnType>, MyClass, myMethod, myArg);
 }
 ```
+
 to
+
 ```c++
 std::shared_ptr<MyReturnType> PyMyClass::myMethod(myArg) override {
   PYBIND11_OVERRIDE(
       PyRetainingSharedPtr<MyReturnType>, MyClass, myMethod, myArg);
 }
 ```
+
 Note that the return type of the C++ member function is unchanged.
 
 This ensures that the `shared_ptr` returned by the member function call
@@ -279,15 +294,19 @@ also keeps the Python object alive.
 
 When binding C++ member functions as Python methods we must modify the
 signature from, for example
+
 ```c++
 .def("myMethod",
      [](MyClass& myObject, std::shared_ptr<MyArg> myArg, ...
 ```
+
 to
+
 ```c++
 .def("myMethod",
      [](MyClass& myObject, PyRetainingSharedPtr<MyArg> myArg, ...
 ```
+
 for all `MyArg` types where we need to keep the incoming Python object
 alive for at least as long as the `shared_ptr`.
 
@@ -295,12 +314,14 @@ As a convenience for decorating (member) function pointers, we have
 added a `RetainPyArgs` helper, which can be used to decorate a function
 such that specific `shared_ptr` arguments are converted to
 `PyRetainingSharedPtr`. For example,
+
 ```c++
 .def("myMethod",
      RetainPyArgs<
          std::shared_ptr<MyArg1>,
          std::shared_ptr<MyArg2>>::forFn<&MyClass::myMethod>(), ...
 ```
+
 will ensure all `shared_ptr<MyArg1>` or `shared_ptr<MyArg2>` arguments
 will be converted to `PyRetainingSharedPtr<MyArg1>` or
 `PyRetainingSharedPtr<MyArg2>`, respectively. This is equivalent to
@@ -310,6 +331,7 @@ manually wrapping in a lambda, as shown above.
 
 pybind11 allows bound methods to have keyword arguments with default
 values, for example
+
 ```c++
 .def("myMethod",
      &MyClass::myMethod, py::arg("myArg") = myDefaultValue, ...
diff --git a/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.cpp b/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.cpp
index 12a2c67e2..dfcad499e 100644
--- a/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.cpp
+++ b/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.cpp
@@ -61,7 +61,7 @@ Str CManagerInterfaceAdapter::displayName() const {
   return {out.data, out.size};
 }
 
-InfoDictionary CManagerInterfaceAdapter::info() const {
+InfoDictionary CManagerInterfaceAdapter::info() {
   // Buffer for error message.
   char errorMessageBuffer[kStringBufferSize];
   // Error message.
@@ -89,13 +89,12 @@ trait::TraitsDatas CManagerInterfaceAdapter::managementPolicy(
     [[maybe_unused]] const trait::TraitSets& traitSets,
     [[maybe_unused]] const access::PolicyAccess policyAccess,
     [[maybe_unused]] const ContextConstPtr& context,
-    [[maybe_unused]] const HostSessionPtr& hostSession) const {
+    [[maybe_unused]] const HostSessionPtr& hostSession) {
   throw std::runtime_error{"Not implemented"};
 }
 
 bool CManagerInterfaceAdapter::isEntityReferenceString(
-    [[maybe_unused]] const Str& someString,
-    [[maybe_unused]] const HostSessionPtr& hostSession) const {
+    [[maybe_unused]] const Str& someString, [[maybe_unused]] const HostSessionPtr& hostSession) {
   throw std::runtime_error{"Not implemented"};
 }
 
diff --git a/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.hpp b/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.hpp
index 274c5cf09..a6cc593cb 100644
--- a/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.hpp
+++ b/src/openassetio-core-c/src/managerApi/CManagerInterfaceAdapter.hpp
@@ -43,7 +43,7 @@ class OPENASSETIO_CORE_C_EXPORT CManagerInterfaceAdapter : ManagerInterface {
   [[nodiscard]] Str displayName() const override;
 
   /// Wrap the C suite's `info` function.
-  [[nodiscard]] InfoDictionary info() const override;
+  [[nodiscard]] InfoDictionary info() override;
 
   /// Wrap the C suite's `initialize` function.
   /// @todo Implement C API. Currently throws `runtime_error`.
@@ -51,14 +51,15 @@ class OPENASSETIO_CORE_C_EXPORT CManagerInterfaceAdapter : ManagerInterface {
 
   /// Wrap the C suite's `managementPolicy` function.
   /// @todo Implement C API. Currently throws `runtime_error`.
-  [[nodiscard]] trait::TraitsDatas managementPolicy(
-      const trait::TraitSets& traitSets, access::PolicyAccess policyAccess,
-      const ContextConstPtr& context, const HostSessionPtr& hostSession) const override;
+  [[nodiscard]] trait::TraitsDatas managementPolicy(const trait::TraitSets& traitSets,
+                                                    access::PolicyAccess policyAccess,
+                                                    const ContextConstPtr& context,
+                                                    const HostSessionPtr& hostSession) override;
 
   /// Wrap the C suite's `isEntityReferenceString` function.
   /// @todo Implement C API. Currently throws `runtime_error`.
   [[nodiscard]] bool isEntityReferenceString(const Str& someString,
-                                             const HostSessionPtr& hostSession) const override;
+                                             const HostSessionPtr& hostSession) override;
 
   /// Wrap the C suite's `entityExists` function.
   /// @todo Implement C API. Currently throws `runtime_error`.
diff --git a/src/openassetio-core/include/openassetio/hostApi/HostInterface.hpp b/src/openassetio-core/include/openassetio/hostApi/HostInterface.hpp
index f0093dd07..0963326f9 100644
--- a/src/openassetio-core/include/openassetio/hostApi/HostInterface.hpp
+++ b/src/openassetio-core/include/openassetio/hostApi/HostInterface.hpp
@@ -103,7 +103,7 @@ class OPENASSETIO_CORE_EXPORT HostInterface {
    *
    * @todo Definitions for well-known keys such as 'version' etc.
    */
-  [[nodiscard]] virtual InfoDictionary info() const;
+  [[nodiscard]] virtual InfoDictionary info();
   /// @}
 };
 }  // namespace hostApi
diff --git a/src/openassetio-core/include/openassetio/hostApi/Manager.hpp b/src/openassetio-core/include/openassetio/hostApi/Manager.hpp
index 708d97a2e..4ced340d1 100644
--- a/src/openassetio-core/include/openassetio/hostApi/Manager.hpp
+++ b/src/openassetio-core/include/openassetio/hostApi/Manager.hpp
@@ -115,7 +115,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    * Manager. They include things such as
    * openassetio.constants.kInfoKey_EntityReferencesMatchPrefix.
    */
-  [[nodiscard]] InfoDictionary info() const;
+  [[nodiscard]] InfoDictionary info();
 
   /**
    * This call gives the Manager a chance to customize certain strings
@@ -141,7 +141,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    *
    * @return Substituted map of terms.
    */
-  StrMap updateTerminology(StrMap terms) const;
+  StrMap updateTerminology(StrMap terms);
 
   /**
    * @}
@@ -163,7 +163,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    * Some managers may not have any settings, so this function will
    * return an empty dictionary.
    */
-  [[nodiscard]] InfoDictionary settings() const;
+  [[nodiscard]] InfoDictionary settings();
 
   /**
    * Prepares the Manager for interaction with a host. In order to
@@ -293,7 +293,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    */
   [[nodiscard]] trait::TraitsDatas managementPolicy(const trait::TraitSets& traitSets,
                                                     access::PolicyAccess policyAccess,
-                                                    const ContextConstPtr& context) const;
+                                                    const ContextConstPtr& context);
 
   /**
    * @}
@@ -508,7 +508,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    * @see @ref entityExists
    * @see @ref resolve
    */
-  [[nodiscard]] bool isEntityReferenceString(const Str& someString) const;
+  [[nodiscard]] bool isEntityReferenceString(const Str& someString);
 
   /**
    * Create an @ref EntityReference object wrapping a given
@@ -529,7 +529,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    *
    * @todo Use a custom exception type rather than std::domain_error.
    */
-  [[nodiscard]] EntityReference createEntityReference(Str entityReferenceString) const;
+  [[nodiscard]] EntityReference createEntityReference(Str entityReferenceString);
 
   /**
    * Create an @ref EntityReference object wrapping a given
@@ -546,7 +546,7 @@ class OPENASSETIO_CORE_EXPORT Manager final {
    * valid, not containing a value otherwise.
    */
   [[nodiscard]] std::optional<EntityReference> createEntityReferenceIfValid(
-      Str entityReferenceString) const;
+      Str entityReferenceString);
 
   /**
    * Callback signature used for a successful entity existence query.
diff --git a/src/openassetio-core/include/openassetio/managerApi/Host.hpp b/src/openassetio-core/include/openassetio/managerApi/Host.hpp
index cd42d2d5c..6a20a0a3a 100644
--- a/src/openassetio-core/include/openassetio/managerApi/Host.hpp
+++ b/src/openassetio-core/include/openassetio/managerApi/Host.hpp
@@ -79,7 +79,7 @@ class OPENASSETIO_CORE_EXPORT Host final {
    *
    *     { 'version' : '1.1v3' }
    */
-  [[nodiscard]] InfoDictionary info() const;
+  [[nodiscard]] InfoDictionary info();
 
   /**
    * @}
diff --git a/src/openassetio-core/include/openassetio/managerApi/ManagerInterface.hpp b/src/openassetio-core/include/openassetio/managerApi/ManagerInterface.hpp
index 22c4016b7..a7864c815 100644
--- a/src/openassetio-core/include/openassetio/managerApi/ManagerInterface.hpp
+++ b/src/openassetio-core/include/openassetio/managerApi/ManagerInterface.hpp
@@ -242,7 +242,7 @@ class OPENASSETIO_CORE_EXPORT ManagerInterface {
    *
    * @return Map of info string key to primitive value.
    */
-  [[nodiscard]] virtual InfoDictionary info() const;
+  [[nodiscard]] virtual InfoDictionary info();
 
   /**
    * This call gives the manager a chance to customize certain strings
@@ -268,8 +268,7 @@ class OPENASSETIO_CORE_EXPORT ManagerInterface {
    *
    * @return Substituted map of terms.
    */
-  [[nodiscard]] virtual StrMap updateTerminology(StrMap terms,
-                                                 const HostSessionPtr& hostSession) const;
+  [[nodiscard]] virtual StrMap updateTerminology(StrMap terms, const HostSessionPtr& hostSession);
 
   /**
    * @}
@@ -292,7 +291,7 @@ class OPENASSETIO_CORE_EXPORT ManagerInterface {
    *
    * The default implementation returns an empty dictionary.
    */
-  [[nodiscard]] virtual InfoDictionary settings(const HostSessionPtr& hostSession) const;
+  [[nodiscard]] virtual InfoDictionary settings(const HostSessionPtr& hostSession);
 
   /**
    * Prepares for interaction with a host.
@@ -418,9 +417,10 @@ class OPENASSETIO_CORE_EXPORT ManagerInterface {
    *
    * @return a `TraitsData` for each element in @p traitSets.
    */
-  [[nodiscard]] virtual trait::TraitsDatas managementPolicy(
-      const trait::TraitSets& traitSets, access::PolicyAccess policyAccess,
-      const ContextConstPtr& context, const HostSessionPtr& hostSession) const = 0;
+  [[nodiscard]] virtual trait::TraitsDatas managementPolicy(const trait::TraitSets& traitSets,
+                                                            access::PolicyAccess policyAccess,
+                                                            const ContextConstPtr& context,
+                                                            const HostSessionPtr& hostSession) = 0;
 
   /**
    * @}
@@ -638,7 +638,7 @@ class OPENASSETIO_CORE_EXPORT ManagerInterface {
    * @see @ref resolve
    */
   [[nodiscard]] virtual bool isEntityReferenceString(const Str& someString,
-                                                     const HostSessionPtr& hostSession) const = 0;
+                                                     const HostSessionPtr& hostSession) = 0;
 
   /**
    * Callback signature used for a successful entity existence query.
diff --git a/src/openassetio-core/src/hostApi/HostInterface.cpp b/src/openassetio-core/src/hostApi/HostInterface.cpp
index 6bb65773d..1cd080855 100644
--- a/src/openassetio-core/src/hostApi/HostInterface.cpp
+++ b/src/openassetio-core/src/hostApi/HostInterface.cpp
@@ -6,7 +6,7 @@
 namespace openassetio {
 inline namespace OPENASSETIO_CORE_ABI_VERSION {
 namespace hostApi {
-InfoDictionary HostInterface::info() const { return {}; }
+InfoDictionary HostInterface::info() { return {}; }
 }  // namespace hostApi
 }  // namespace OPENASSETIO_CORE_ABI_VERSION
 }  // namespace openassetio
diff --git a/src/openassetio-core/src/hostApi/Manager.cpp b/src/openassetio-core/src/hostApi/Manager.cpp
index f1cb051fc..1c7595414 100644
--- a/src/openassetio-core/src/hostApi/Manager.cpp
+++ b/src/openassetio-core/src/hostApi/Manager.cpp
@@ -88,13 +88,13 @@ Identifier Manager::identifier() const { return managerInterface_->identifier();
 
 Str Manager::displayName() const { return managerInterface_->displayName(); }
 
-InfoDictionary Manager::info() const { return managerInterface_->info(); }
+InfoDictionary Manager::info() { return managerInterface_->info(); }
 
-StrMap Manager::updateTerminology(StrMap terms) const {
+StrMap Manager::updateTerminology(StrMap terms) {
   return managerInterface_->updateTerminology(std::move(terms), hostSession_);
 }
 
-InfoDictionary Manager::settings() const { return managerInterface_->settings(hostSession_); }
+InfoDictionary Manager::settings() { return managerInterface_->settings(hostSession_); }
 
 void Manager::initialize(InfoDictionary managerSettings) {
   managerInterface_->initialize(std::move(managerSettings), hostSession_);
@@ -107,7 +107,7 @@ void Manager::flushCaches() { managerInterface_->flushCaches(hostSession_); }
 
 trait::TraitsDatas Manager::managementPolicy(const trait::TraitSets &traitSets,
                                              const access::PolicyAccess policyAccess,
-                                             const ContextConstPtr &context) const {
+                                             const ContextConstPtr &context) {
   return managerInterface_->managementPolicy(traitSets, policyAccess, context, hostSession_);
 }
 
@@ -144,7 +144,7 @@ ContextPtr Manager::contextFromPersistenceToken(const Str &token) {
   return context;
 }
 
-bool Manager::isEntityReferenceString(const Str &someString) const {
+bool Manager::isEntityReferenceString(const Str &someString) {
   if (!entityReferencePrefix_) {
     return managerInterface_->isEntityReferenceString(someString, hostSession_);
   }
@@ -154,15 +154,14 @@ bool Manager::isEntityReferenceString(const Str &someString) const {
 
 const Str kCreateEntityReferenceErrorMessage = "Invalid entity reference: ";
 
-EntityReference Manager::createEntityReference(Str entityReferenceString) const {
+EntityReference Manager::createEntityReference(Str entityReferenceString) {
   if (!isEntityReferenceString(entityReferenceString)) {
     throw std::domain_error{kCreateEntityReferenceErrorMessage + entityReferenceString};
   }
   return EntityReference{std::move(entityReferenceString)};
 }
 
-std::optional<EntityReference> Manager::createEntityReferenceIfValid(
-    Str entityReferenceString) const {
+std::optional<EntityReference> Manager::createEntityReferenceIfValid(Str entityReferenceString) {
   if (!isEntityReferenceString(entityReferenceString)) {
     return {};
   }
diff --git a/src/openassetio-core/src/managerApi/Host.cpp b/src/openassetio-core/src/managerApi/Host.cpp
index abdcbe4c3..9a4498151 100644
--- a/src/openassetio-core/src/managerApi/Host.cpp
+++ b/src/openassetio-core/src/managerApi/Host.cpp
@@ -16,7 +16,7 @@ Host::Host(hostApi::HostInterfacePtr hostInterface) : hostInterface_{std::move(h
 
 Identifier Host::identifier() const { return hostInterface_->identifier(); }
 Str Host::displayName() const { return hostInterface_->displayName(); }
-InfoDictionary Host::info() const { return hostInterface_->info(); }
+InfoDictionary Host::info() { return hostInterface_->info(); }
 
 }  // namespace managerApi
 }  // namespace OPENASSETIO_CORE_ABI_VERSION
diff --git a/src/openassetio-core/src/managerApi/ManagerInterface.cpp b/src/openassetio-core/src/managerApi/ManagerInterface.cpp
index 74d0db1a4..47406c211 100644
--- a/src/openassetio-core/src/managerApi/ManagerInterface.cpp
+++ b/src/openassetio-core/src/managerApi/ManagerInterface.cpp
@@ -13,15 +13,14 @@ namespace managerApi {
 
 ManagerInterface::ManagerInterface() = default;
 
-InfoDictionary ManagerInterface::info() const { return {}; }
+InfoDictionary ManagerInterface::info() { return {}; }
 
-StrMap ManagerInterface::updateTerminology(
-    StrMap terms, [[maybe_unused]] const HostSessionPtr& hostSession) const {
+StrMap ManagerInterface::updateTerminology(StrMap terms,
+                                           [[maybe_unused]] const HostSessionPtr& hostSession) {
   return terms;
 }
 
-InfoDictionary ManagerInterface::settings(
-    [[maybe_unused]] const HostSessionPtr& hostSession) const {
+InfoDictionary ManagerInterface::settings([[maybe_unused]] const HostSessionPtr& hostSession) {
   return openassetio::InfoDictionary{};
 }
 
diff --git a/src/openassetio-python/cmodule/src/hostApi/HostInterfaceBinding.cpp b/src/openassetio-python/cmodule/src/hostApi/HostInterfaceBinding.cpp
index 33ac926c3..f0b7244b2 100644
--- a/src/openassetio-python/cmodule/src/hostApi/HostInterfaceBinding.cpp
+++ b/src/openassetio-python/cmodule/src/hostApi/HostInterfaceBinding.cpp
@@ -27,7 +27,7 @@ struct PyHostInterface : HostInterface {
     PYBIND11_OVERRIDE_PURE(Str, HostInterface, displayName, /* no args */);
   }
 
-  [[nodiscard]] InfoDictionary info() const override {
+  [[nodiscard]] InfoDictionary info() override {
     PYBIND11_OVERRIDE(InfoDictionary, HostInterface, info, /* no args */);
   }
 };
diff --git a/src/openassetio-python/cmodule/src/managerApi/ManagerInterfaceBinding.cpp b/src/openassetio-python/cmodule/src/managerApi/ManagerInterfaceBinding.cpp
index 171f4e495..f06e8b87f 100644
--- a/src/openassetio-python/cmodule/src/managerApi/ManagerInterfaceBinding.cpp
+++ b/src/openassetio-python/cmodule/src/managerApi/ManagerInterfaceBinding.cpp
@@ -37,11 +37,11 @@ struct PyManagerInterface : ManagerInterface {
     PYBIND11_OVERRIDE_PURE(Str, ManagerInterface, displayName, /* no args */);
   }
 
-  [[nodiscard]] InfoDictionary info() const override {
+  [[nodiscard]] InfoDictionary info() override {
     PYBIND11_OVERRIDE(InfoDictionary, ManagerInterface, info, /* no args */);
   }
 
-  [[nodiscard]] InfoDictionary settings(const HostSessionPtr& hostSession) const override {
+  [[nodiscard]] InfoDictionary settings(const HostSessionPtr& hostSession) override {
     PYBIND11_OVERRIDE(InfoDictionary, ManagerInterface, settings, hostSession);
   }
 
@@ -54,9 +54,10 @@ struct PyManagerInterface : ManagerInterface {
     PYBIND11_OVERRIDE(void, ManagerInterface, flushCaches, hostSession);
   }
 
-  [[nodiscard]] trait::TraitsDatas managementPolicy(
-      const trait::TraitSets& traitSets, access::PolicyAccess policyAccess,
-      const ContextConstPtr& context, const HostSessionPtr& hostSession) const override {
+  [[nodiscard]] trait::TraitsDatas managementPolicy(const trait::TraitSets& traitSets,
+                                                    access::PolicyAccess policyAccess,
+                                                    const ContextConstPtr& context,
+                                                    const HostSessionPtr& hostSession) override {
     PYBIND11_OVERRIDE_PURE(trait::TraitsDatas, ManagerInterface, managementPolicy, traitSets,
                            policyAccess, context, hostSession);
   }
@@ -83,7 +84,7 @@ struct PyManagerInterface : ManagerInterface {
   }
 
   [[nodiscard]] bool isEntityReferenceString(const Str& someString,
-                                             const HostSessionPtr& hostSession) const override {
+                                             const HostSessionPtr& hostSession) override {
     PYBIND11_OVERRIDE_PURE(bool, ManagerInterface, isEntityReferenceString, someString,
                            hostSession);
   }
@@ -97,7 +98,7 @@ struct PyManagerInterface : ManagerInterface {
   }
 
   [[nodiscard]] StrMap updateTerminology(StrMap terms,
-                                         const HostSessionPtr& hostSession) const override {
+                                         const HostSessionPtr& hostSession) override {
     PYBIND11_OVERRIDE(StrMap, ManagerInterface, updateTerminology, std::move(terms), hostSession);
   }
 


Test patch:
diff --git a/src/openassetio-core-c/tests/hostApi/ManagerTest.cpp b/src/openassetio-core-c/tests/hostApi/ManagerTest.cpp
index 4a3d8fd72..7bcefd2f4 100644
--- a/src/openassetio-core-c/tests/hostApi/ManagerTest.cpp
+++ b/src/openassetio-core-c/tests/hostApi/ManagerTest.cpp
@@ -42,10 +42,10 @@ constexpr size_t kStringBufferSize = 500;
 struct MockManagerInterface : trompeloeil::mock_interface<managerApi::ManagerInterface> {
   IMPLEMENT_CONST_MOCK0(identifier);
   IMPLEMENT_CONST_MOCK0(displayName);
-  IMPLEMENT_CONST_MOCK0(info);
+  IMPLEMENT_MOCK0(info);
   IMPLEMENT_MOCK2(initialize);
-  IMPLEMENT_CONST_MOCK4(managementPolicy);
-  IMPLEMENT_CONST_MOCK2(isEntityReferenceString);
+  IMPLEMENT_MOCK4(managementPolicy);
+  IMPLEMENT_MOCK2(isEntityReferenceString);
   IMPLEMENT_MOCK5(entityExists);
   IMPLEMENT_MOCK7(resolve);
   IMPLEMENT_MOCK7(preflight);
@@ -59,7 +59,7 @@ struct MockManagerInterface : trompeloeil::mock_interface<managerApi::ManagerInt
 struct MockHostInterface : trompeloeil::mock_interface<hostApi::HostInterface> {
   IMPLEMENT_CONST_MOCK0(identifier);
   IMPLEMENT_CONST_MOCK0(displayName);
-  IMPLEMENT_CONST_MOCK0(info);
+  IMPLEMENT_MOCK0(info);
 };
 /**
  * Mock implementation of a LoggerInterface
diff --git a/src/openassetio-core-c/tests/managerApi/CManagerInterfaceAdapterTest.cpp b/src/openassetio-core-c/tests/managerApi/CManagerInterfaceAdapterTest.cpp
index 2f7aef66d..0afbb74ef 100644
--- a/src/openassetio-core-c/tests/managerApi/CManagerInterfaceAdapterTest.cpp
+++ b/src/openassetio-core-c/tests/managerApi/CManagerInterfaceAdapterTest.cpp
@@ -184,7 +184,7 @@ SCENARIO("A host calls CManagerInterfaceAdapter::info") {
     // goes out of scope.
     REQUIRE_CALL(mockImpl, dtor(handle));
 
-    const openassetio::managerApi::CManagerInterfaceAdapter cManagerInterface{handle, suite};
+    openassetio::managerApi::CManagerInterfaceAdapter cManagerInterface{handle, suite};
 
     AND_GIVEN("the C suite's info() call succeeds") {
       const openassetio::Str expectedInfoKey = "info key";
diff --git a/src/openassetio-core/tests/hostApi/ManagerTest.cpp b/src/openassetio-core/tests/hostApi/ManagerTest.cpp
index fb2388293..6c77d4e0c 100644
--- a/src/openassetio-core/tests/hostApi/ManagerTest.cpp
+++ b/src/openassetio-core/tests/hostApi/ManagerTest.cpp
@@ -27,10 +27,10 @@ namespace {
 struct MockManagerInterface : trompeloeil::mock_interface<managerApi::ManagerInterface> {
   IMPLEMENT_CONST_MOCK0(identifier);
   IMPLEMENT_CONST_MOCK0(displayName);
-  IMPLEMENT_CONST_MOCK0(info);
+  IMPLEMENT_MOCK0(info);
   IMPLEMENT_MOCK2(initialize);
-  IMPLEMENT_CONST_MOCK4(managementPolicy);
-  IMPLEMENT_CONST_MOCK2(isEntityReferenceString);
+  IMPLEMENT_MOCK4(managementPolicy);
+  IMPLEMENT_MOCK2(isEntityReferenceString);
   IMPLEMENT_MOCK5(entityExists);
   IMPLEMENT_MOCK7(resolve);
   IMPLEMENT_MOCK7(preflight);
@@ -44,7 +44,7 @@ struct MockManagerInterface : trompeloeil::mock_interface<managerApi::ManagerInt
 struct MockHostInterface : trompeloeil::mock_interface<hostApi::HostInterface> {
   IMPLEMENT_CONST_MOCK0(identifier);
   IMPLEMENT_CONST_MOCK0(displayName);
-  IMPLEMENT_CONST_MOCK0(info);
+  IMPLEMENT_MOCK0(info);
 };
 /**
  * Mock implementation of a LoggerInterface